1

当我找到 28-FEB-11 和 29-FEB-12 之间的月份时,oracle 中的months_between 函数返回12。实际上它应该是12.096。此函数不适用于闰年。

在 28-FEB-11 和 29-FEB-12 之间,为 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

这是甲骨文的错误吗???

-维什瓦

4

2 回答 2

5

Oracle 文档

MONTHS_BETWEEN 返回日期 date1 和 date2 之间的月数。如果 date1 晚于 date2,则结果为正。如果 date1 早于 date2,则结果是否定的。如果 date1 和 date2 是一个月中的同一天或两个月的最后一天,则结果始终为整数。否则,Oracle 数据库会根据 31 天的月份计算结果的小数部分,并考虑时间组件 date1 和 date2 的差异。

因此,它遵循记录在案的行为。这不是你所期望的。

于 2012-10-03T13:34:01.407 回答
-1

这不是一个错误,因为 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

于 2012-12-07T18:05:30.053 回答