几个月之间的闰年

时间:2012-10-03 13:30:36

标签: oracle date-arithmetic

当我发现28-FEB-11和29-FEB-12之间的月份时,oracle中的函数之间的月份返回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

这是一个Oracle bug ?? ..

-Vishwa

2 个答案:

答案 0 :(得分:5)

来自Oracle documentation

  

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

所以它遵循记录的行为。这不是你所期望的。

答案 1 :(得分:-1)

这不是一个错误,因为ORACLE这么说,这是一个由人类驱动的逻辑错误(并且记录为严格的东西),这更糟糕。

如果1月和2月的最后几天之间的差异恰好是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