Неожиданный результат функции Oracle month_between

Функция Oracle month_between возвращает неожиданные результаты.

Например, разница между 20191001 и 20190916 составляет 15 дней, поэтому ожидается, что возвращаемое значение функции будет (1/31) * 15 = 0,4838....

SELECT months_between('20191001','20190916')
from dual

.5161290322580645161290322580645161290323

Это спецификация? Или это ошибка?

Кажется, возвращается 16/31, т.е. включены даты начала и окончания.

jarlh 27.05.2019 09:48

вероятно, не включен SELECTmonths_between(дата '2019-09-30', дата '2019-09-15') из двойного возврата 0,4838

user8669400 27.05.2019 09:51

Технические характеристики; см. справочный раздел "назначение": docs.oracle.com/cd/B19306_01/server.102/b14200/fun‌​ctions089.htm

Caius Jard 27.05.2019 09:59
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
3
112
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Функция 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».

Caius Jard 27.05.2019 09:58

@CaiusJard Спасибо, что указали на это. Я прочитал приведенную выше документацию, но настолько сосредоточился на решении конкретной проблемы в вопросе, что забыл упомянуть другие случаи.

Joakim Danielson 27.05.2019 10:07

Другие вопросы по теме