如何sql工作:选择months_between('29 -Mar-2015','28 -Feb-2015')为m from dual;

时间:2015-04-06 15:09:55

标签: sql oracle

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更大? 请帮我。 感谢。

2 个答案:

答案 0 :(得分:2)

引用documentation

  

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.