Функция Oracle month_between возвращает неожиданные результаты.
Например, разница между 20191001 и 20190916 составляет 15 дней, поэтому ожидается, что возвращаемое значение функции будет (1/31) * 15 = 0,4838....
SELECT months_between('20191001','20190916')
from dual
.5161290322580645161290322580645161290323
Это спецификация? Или это ошибка?
вероятно, не включен SELECTmonths_between(дата '2019-09-30', дата '2019-09-15') из двойного возврата 0,4838
Технические характеристики; см. справочный раздел "назначение": docs.oracle.com/cd/B19306_01/server.102/b14200/functions089.htm
Функция MONTHS_BETWEEN работает с 31-дневным месяцем, когда день месяца не является последним днем месяца.
SELECT MONTHS_BETWEEN
(TO_DATE('20190201','YYYYMMDD'),
TO_DATE('20190131','YYYYMMDD') ) "Months"
FROM DUAL;
вернет 0,032 (округлено), но
SELECT MONTHS_BETWEEN
(TO_DATE('20190301','YYYYMMDD'),
TO_DATE('20190228','YYYYMMDD') ) "Months"
FROM DUAL;
вернет 0,129
Более полное описание MONTHS_BETWEN см. в статье документация.
Не совсем универсально верно, но работает для этого сценария. Документы говорят "Назначение MONTHS_BETWEEN возвращает количество месяцев между датами date1 и date2. Если date1 позже, чем date2, то результат положительный. Если date1 раньше, чем date2, то результат отрицательный. Если date1 и date2 являются либо одними и теми же днями месяца, либо обоими последними днями месяцев, то результатом всегда является целое число. В противном случае Oracle Database вычисляет дробную часть результата основан на 31-дневном месяце и учитывает разницу во временных компонентах date1 и date2».
@CaiusJard Спасибо, что указали на это. Я прочитал приведенную выше документацию, но настолько сосредоточился на решении конкретной проблемы в вопросе, что забыл упомянуть другие случаи.
Кажется, возвращается 16/31, т.е. включены даты начала и окончания.