当我发现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
答案 0 :(得分:5)
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