month_between для високосного года

Когда я нахожу месяцы между 28-FEB-11 и 29-FEB-12, функция month_between в оракуле возвращает 12. На самом деле это должно быть 12.096. Эта функция не вычисляет собственно високосный год.

В период с 28 февраля 2011 г. по 29 февраля 2012 г. он составляет 1 год (12 месяцев) и 1 день.

      select months_between('28-FEB-12', '28-FEB-11') from dual; -- 12
      **select months_between('29-FEB-12', '28-FEB-11') from dual; -- 12**
      select months_between('28-FEB-12', '27-FEB-11') from dual; -- 12.0322
      select months_between('27-FEB-12', '28-FEB-11') from dual; -- 11.9677

это ошибка Oracle??..

-Вишва


person user1717221    schedule 03.10.2012    source источник
comment
Вы могли бы легко ответить на этот вопрос для себя, прочитав документацию. Документация Oracle находится в онлайновом режиме, является всеобъемлющей и бесплатной. Вы должны научиться им пользоваться. oracle.com/pls/db111/homepage   -  person APC    schedule 03.10.2012


Ответы (2)


Из документации Oracle:

MONTHS_BETWEEN возвращает количество месяцев между датами date1 и date2. Если дата1 позже даты2, то результат положительный. Если дата1 предшествует дате2, то результат отрицательный. Если date1 и date2 являются либо одними и теми же днями месяца, либо обоими последними днями месяцев, то результатом всегда является целое число. В противном случае Oracle Database вычисляет дробную часть результата на основе 31-дневного месяца и учитывает разницу во временных компонентах date1 и date2.

Таким образом, он следует задокументированному поведению. Это просто не то, что вы ожидали.

person Jim Hudson    schedule 03.10.2012
comment
Другими словами, months_between('30-APR-12', '31-JUL-12') точно равно 3. - person APC; 03.10.2012

Это не ошибка, потому что ORACLE так говорит, это логическая ошибка, вызванная человеком (и документированная как нечто правильное), что еще хуже.

Как же так, если разница между последними днями января и февраля ровно 1 месяц (29 точных дней). Пожалуйста, смотрите ниже:

MONTHS_BETWEEN('29-FEB-12','31-JAN-12')
1

С дополнительным днем ​​(30 дней) разница в месяцах составляет менее 1. См. ниже:

MONTHS_BETWEEN('29-FEB-12','30-JAN-12')
.967741935

НЕПРАВИЛЬНЫЙ. Это совсем не так!

SQL Server с другой стороны обрабатывает это правильно:

select DATEDIFF(MM,'29-FEB-12','30-JAN-12')
select DATEDIFF(MM,'29-FEB-12','31-JAN-12')

оба 1

person Harley    schedule 07.12.2012
comment
Скорее всего, SQL Server получает то же значение, просто округляя до целого числа. - person Felix Guo; 07.12.2012