2017-08-31 35 views
1

私は2つの日付の違いを見つけ、結果をYYYY-MM-DD形式で表示していますが、エラーが発生しました。誰かが私にこれを助けることができますか?PL/SQL:2つの日付の差

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日? 「1年」とは何ですか? –

+0

ありがとうございます! YYYY-MM-DD形式の結果を取得するにはどうすればよいですか? –

+1

私のコメントは明確ではありませんか? YYYY-MM-DDは** DATE **です。つまり、タイムライン上の特定のポイント、カレンダーの中の1日です。 2つの日付の違いは間隔です。 YYYY-MM-DDとしてフォーマットすることはできません。少なくとも、これは便利な方法ではありません。私の質問に答えを与えたら、醜い回避策の解決策を得るかもしれません。 –

答えて

1

+D HH24:MI:SS.FF6ようなフォーマットを取得するにはINTERVAL DAY TO SECONDタイプを使用します。

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; 
/

または、フォーマットYYYY-MM-DDの違いを取得するためにMONTHS_BETWEEN機能を使用します。

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

の下で@Wernfried Domscheitのコメントを見てください。次の文で手順を実行しようとしました。 EXEC DATECALCULATOR( '2017-09-10'、 '2010-01-01'); エラーが発生しました ORA-01861:リテラルはフォーマット文字列と一致しませんORA-06512:1行目 –

+0

「2017-09-10」は日付リテラルではありません。文字リテラルです。 'NLS_DATE_FORMAT'セッション・パラメータをフォーマット・マスクとして使用して暗黙的に日付リテラルにキャストしようとしますが、それがあなたの' YYYY-MM-DD'日付フォーマットと一致しない場合、失敗します。日付リテラルを使用してください: 'EXEC DATECALCULATOR(日付 '2017-09-10'、日付 '2010-01-01')' – MT0

+0

これは今動作します。 ありがとうございます。 –

3

あなたは、この2つの日付の間の日数のカウントを取得する他の1日から引く場合。 to_date機能によってこの値を日付に変換することはできません。そして、何日あなたはそれが平均だ456日の日付の間の例の差を取得したい:

1 year 3 month and several days

フォーマットされた文字列値を返すために良いかもしれ?

+0

結果をYYYY-MM-DD形式で入力します。それを得ることができませんでした。 –

+0

それはできません。質問 – HAYMbl4

関連する問題