Months_between函数无法正常工作:从3月到2月:
select months_between('28-Mar-2015','28-Feb-2015') as months from dual; => 1 Correct=0.90
select months_between('29-Mar-2015','28-Feb-2015') as months from dual; => 1.03 Correct=0.94
select months_between('30-Mar-2015','28-Feb-2015') as months from dual; => 1.06 Correct=0.97
select months_between('31-Mar-2015','28-Feb-2015') as months from dual; => 1 Correct=1
上面的oracle sql给了我这样的结果。如:Question1 answer = 1;问题2答案= 1.03;问题3答案= 1.06;问题4答案= 1;我们知道上次约会的日期是1个月。如何可能的最后日期到29日或30日是否意味着比1更大? 请帮我。 感谢。
答案 0 :(得分:2)
MONTHS_BETWEEN返回date1和date2之间的月份数。 如果date1晚于date2,则结果为正。如果date1是 早于date2,则结果为负。如果是date1和date2 是月份的同一天,也可能是几个月的最后几天, 那么结果总是一个整数。否则是Oracle数据库 根据31天计算结果的小数部分 月份并考虑时间组成部分date1和date2的差异。
因此,在示例1中,两个日期之间有31天,因此结果为1.
在示例2中,日期1晚于日期2,因此结果为正,并且因为它超过整整一个月的一天,结果为1.03
同样的事情发生在例3中,但现在比整整一个月的时间差多了2天,所以结果是1.06
在最后一个例子中,我们有两个日期是这几个月的最后日期,因此结果再次为1.
简而言之,该功能按照设计工作,但可能不适合您的特定需求。
答案 1 :(得分:0)
如果你想要你的例子中的值,那么你可以减去日期并将它们除以31:
select round((date '2015-03-28' - date '2015-02-28') / 31, 2) from dual; -- 0.90
select round((date '2015-03-29' - date '2015-02-28') / 31, 2) from dual; -- 0.94
select round((date '2015-03-30' - date '2015-02-28') / 31, 2) from dual; -- 0.97
select round((date '2015-03-31' - date '2015-02-28') / 31, 2) from dual; -- 1
根据wikipedia年平均天数 是365.2425,所以也许你想要除以31而不是(365.2425 / 12) - 大约30,436875。
为什么Oracle会提供这样的结果?
对于29日 - 3月和28日 - 2月的日期不同(29,28),并非两者都是一个月的最后几天,因此Oracle以这种方式计算:1 +(29-28)/ 31.