1. SQL / Говнокод #2865

    −859.6

    1. 1
    2. 2
    3. 3
    select date '1582-10-31' - date '1582-10-01' + 1 "Дней в октябре 1582г" from dual;
    
    Выдаёт число 21

    Даже и не знаю как это назвать. Вроде все правильно, но как-то заковыристо.

    Запостил: dim1r, 25 Марта 2010

    Комментарии (16) RSS

    • Это Оracle такой нюанс знает. А другие базы знают ?
      Ответить
      • Мускуль не знает. Вернул 30
        SELECT DATEDIFF('1582-10-31', '1582-10-01');

        Ответить
        • еще одно подтверждение унылости мускуля
          Ответить
          • А как часто Вам нужны даты до 1582 года? :)
            Ответить
            • наверное используются только по ошибке :)
              Ответить
          • Кстати, этот момент в MySQL документирован
            Ответить
            • Да, вот пруфлинк http://dev.mysql.com/doc/refman/5.1-maria/en/mysql-calendar.html
              Там еще объясняется почему именно такое поведение, оно к тому же стандартизировано.
              Ответить
    • Википедия

      Григориа́нский календа́рь в католических странах был введён папой Григорием XIII 4 октября 1582 года взамен старого юлианского: следующим днём после четверга 4 октября стала пятница 15 октября (дней с 5 по 14 октября 1582 в григорианском календаре нет).

      Так что все правильно
      Ответить
      • А в .Net-е лажа, new DateTime(1582, 10, 31) - new DateTime(1582, 10, 1) - вернул 30 дней. :(
        Ответить
      • Утро вечера мудренее. По ссылке HyperGeek стало понятно, почему в MySQL, еще и в .Net, возращает 30 дней - календарь в разных странах вводился в разное время. Поэтому Оракл с одной стороны прав, с другой стороны не прав
        Ответить
        • Оракл со всех сторон прав, потому что у него есть еще и:
          alter session set nsl_calendar=<...>

          задающий тип календаря для сессии, и период перехода, если таковой был, зависит от него...
          Ответить
    • О_о познавательно... даже и не знал об этом...
      вот так вот читаешь говнокод и уму-разуму набираешься...
      Ответить
    • а вообще to_date бы хорошо использовать,
      либо писать "alter session set nsl_date_format" при коннекте в базу.
      Ответить

    Добавить комментарий