2017-08-31 74 views
1

我已經編寫了一個程序來查找兩個日期之間的差異,並以YYYY-MM-DD格式顯示結果,但遇到錯誤。誰可以幫我這個事?PL/SQL:兩個日期之間的差異

CREATE OR REPLACE PROCEDURE DATECALCULATOR(DATE_1 IN DATE, DATE_2 IN DATE) AS 
    DATEDIFF DATE; 

BEGIN 
    DATEDIFF=TO_DATE(DATE_1,'YYYY-MM-DD')-TO_DATE(DATE_2,'YYYY-MM-DD'); 
    DBMS_OUTPUT.PUT_LINE ('Date difference is: ' || TO_DATE(DATEDIFF,'YYYY-MM-DD')); 
END; 
/

Excecute程序代碼:

EXECUTE DATECALCULATOR('2017-09-10', '2010-01-01'); 
+0

你不能做到這一點。你的期望是什麼? '0007-09-10'?你會考慮這個輸出的閏年嗎?你認爲30天的「一個月」是什麼? 31天?什麼是「一年」? –

+0

謝謝! 應該怎麼做才能得到YYYY-MM-DD格式的結果? –

+1

我的評論不清楚嗎? YYYY-MM-DD是**日期**,即時間線上的某個點,日曆中的某一天。兩個日期之間的差異是一個時間間隔。您不能將其格式設置爲YYYY-MM-DD - 至少不能以有用的方式進行格式化。爲我的問題提供答案,然後您可能會得到一個醜陋解決方法的解決方案。 –

回答

1

使用的INTERVAL DAY TO SECOND類型,以獲得格式+D HH24:MI:SS.FF6

CREATE OR REPLACE PROCEDURE DATECALCULATOR(
    DATE_1 IN DATE, 
    DATE_2 IN DATE 
) AS 
    DATEDIFF INTERVAL DAY(9) TO SECOND; 
BEGIN 
    DATEDIFF= (DATE_1- DATE_2) DAY(9) TO SECOND; 
    DBMS_OUTPUT.PUT_LINE('Date difference is: ' || DATEDIFF); 
END; 
/

或者,使用MONTHS_BETWEEN函數獲取格式YYYY-MM-DD的區別:

CREATE OR REPLACE PROCEDURE DATECALCULATOR(
    range_end IN DATE, 
    range_start IN DATE 
) AS 
    DIFF NUMBER := TRUNC(MONTHS_BETWEEN(DATE_1, DATE_2)) - 1; 
    dt DATE := ADD_MONTHS(range_start, diff); 
    d INTEGER := TRUNC(range_end - dt); 
    dy INTEGER := EXTRACT(DAY FROM LAST_DAY(dt)); 
    m INTEGER; 
    y INTEGER; 
BEGIN 
    IF d > dy THEN 
    diff := diff + 1; 
    d := d - dy; 
    END IF; 
    m := MOD(TRUNC(diff), 12); 
    y := TRUNC(diff/12); 

    DBMS_OUTPUT.PUT_LINE('Date difference is: ' 
    || TO_CHAR(y, '0009') || '-' || TO_CHAR(m, 'FM09') || '-' || TO_CHAR(d, 'FM09') 
); 
END; 
/
+0

這個問題上的評論我試着用下面的語句執行程序 EXEC DATECALCULATOR('2017-09-10','2010-01-01'); 但我得到一個錯誤, ORA-01861:文字不匹配格式字符串ORA-06512:在line 1 –

+0

''2017-09-10''是不是字面的日期 - 它是一個字符串。 Oracle會隱式地嘗試使用'NLS_DATE_FORMAT'會話參數作爲格式掩碼將其轉換爲日期字面值,但如果它與'YYYY-MM-DD'日期格式不匹配,則會失敗。只需使用日期文字:'EXEC DATECALCULATOR(DATE'2017-09-10',DATE'2010-01-01')' – MT0

+0

它現在有效。 謝謝。 –

3

如果從另一個日期減去你會得到這兩個日期之間的天計數。您不能通過to_date函數將此值轉換爲日期。什麼日期,你想要得到的日期之間的差異例如456天它的意思是:

1 year 3 month and several days

可能是更好的回報格式化字符串值?

+0

我想要YYYY-MM-DD格式的結果。無法得到它。 –

+0

你不能那樣做。請看@Wernfried Domscheit在 – HAYMbl4