嗨,我一直遇到一个问题,即从当前月份(不包括当天)获得正确的差异。
即如果查询运行的月份是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
请有人能让我说得对,我已经用这个抨击了我一段时间
感谢
答案 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时起的月数,然后减去结果。