0

私は2つの日付パラメータを取る関数を持っています:

CREATE OR REPLACE FUNCTION date_equal
(
    date1 IN DATE,
    date2 IN DATE
)
RETURN NUMBER IS
    equal BOOLEAN;
BEGIN
    equal := NVL(date1, '1999-01-01') = NVL(date2, '1999-01-01');
    IF equal THEN
        RETURN 1;
    ELSE
        RETURN 0;
    END IF;
END date_equal;
/

ここで、関数のデータを提供するテーブルで select を実行すると、正常に実行されます。

SELECT TO_DATE(some_date, 'YYYY-MM-DD') FROM tbl

しかし、関数呼び出しでそれを使用しようとすると失敗します:

SELECT date_equal(TO_DATE(some_date, 'YYYY-MM-DD'), TO_DATE(some_date, 'YYYY-MM-DD')) FROM tbl

エラーメッセージは「リテラルがフォーマット文字列と一致しません」です。なぜそれが起こるのか誰か知っていますか?

4

2 に答える 2

4

あなたがするとき

NVL(date1, '1999-01-01')

Oracle は、'1999-01-01' を暗黙的に日付に変換しようとします (date1 は日付であるため)。
これを行うために、NLS_DATE_FORMAT を使用しますが、yyyy-mm-dd

明示的な変換を使用できます。

NVL(date1, to_date('1999-01-01', 'yyyy-mm-dd'))

またはANSIの方法を使用する

NVL(date1, date '1999-01-01')
于 2013-07-24T16:04:16.320 に答える
2

エラーメッセージは、ピースの読み取りが原因であることが最も確実NVL(date1, '1999-01-01')です。

nvl(date1, date '1999-01-01')代わりに試してください。

于 2013-07-24T16:05:04.567 に答える