Oracle正确地获得了月份差异

时间:2013-03-22 14:05:17

标签: sql oracle oracle11g

嗨,我一直遇到一个问题,即从当前月份(不包括当天)获得正确的差异。

即如果查询运行的月份是2013年3月

然后应该是结果

EXECUTION_DATE, EXEC_DIFF
01-FEB-13,  1
31-JAN-13,  2
30-JAN-13,  2

然而使用下面的sql语句我得到

EXECUTION_DATE, EXEC_DIFF
01-FEB-13,  1
31-JAN-13,  2
30-JAN-13,  1
select EXECUTION_DATE,
       floor(MONTHS_BETWEEN (trunc(sysdate,'MM')-1, EXECUTION_DATE))+1 "EXEC_DIFF"
from V_CERT_LIST  
WHERE EXECUTION_DATE < TO_DATE('02/02/2013','DD/MM/YYYY') 
ORDER BY EXECUTION_DATE DESC

请有人能让我说得对,我已经用这个抨击了我一段时间

感谢

3 个答案:

答案 0 :(得分:4)

select EXECUTION_DATE,
       MONTHS_BETWEEN (trunc(sysdate,'MM'), trunc(EXECUTION_DATE,'MM')) "EXEC_DIFF"
from V_CERT_LIST  
WHERE EXECUTION_DATE < TO_DATE('02/02/2013','DD/MM/YYYY') 
ORDER BY EXECUTION_DATE DESC

答案 1 :(得分:1)

没有寻找分数但无法理解months_between有什么问题?根据我的理解,月份执行发生时间无关紧要 - 1月31日或1月30日... 1月和3月之间的差异仍然是2个月,如您的示例所示。我可以在查询中添加更多天数,但是mo_betw。仍然是一样的......:

SELECT to_char(exec_date, 'DD-MON-YYYY') exec_date, MONTHS_BETWEEN(run_date, exec_date) months_btwn
 FROM
 (
 SELECT to_date('01/03/2013', 'DD/MM/YYYY') run_date
     , Add_Months(Trunc(sysdate,'YEAR'),Level-1) exec_date -- first day of each month
   FROM dual
 CONNECT BY LEVEL <= 3
 )
/


EXEC_DATE   MONTHS_BTWN
------------------------
 01-JAN-2013    2
 01-FEB-2013    1
 01-MAR-2013    0

答案 2 :(得分:0)

Months_Between具有复杂的逻辑,需要考虑月中的某一天。

也许你想要的是这个:

select EXECUTION_DATE,
       ((year(sysdate)*12+month(sysdate)) - (year(execution_date)*12 + month(execution_date))
       ) as Exec_Diff
from V_CERT_LIST  
WHERE EXECUTION_DATE < TO_DATE('02/02/2013','DD/MM/YYYY') 
ORDER BY EXECUTION_DATE DESC

这会将年/月组合转换为自0时起的月数,然后减去结果。