2013-03-22 58 views
2

嗨我一直有一個問題,從當前的一個月的日期得到正確的區別不包括一天。甲骨文正確獲取月份差異

即如果在運行查詢的月份是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 

請有人可以讓我正確地抨擊我的頭已經有一段時間了

感謝

回答

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 
+0

非常感謝你,我現在看到哪裏我一直在出錯 – cghrmauritius 2013-03-22 14:21:00

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時間的月數,然後減去結果。

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