1

次のクエリでエラーが発生しています:

SELECT to_char(last_day(add_months(to_char(to_date('01-02-2013','dd-mm-yyyy'),
    'dd-MON-yyyy'),-1)) + 1,'dd-mm-yyyy') FROM dual;

ORA-01858: a non-numeric character was found where a numeric was expected

これを2つのシステムで試しました:

  1. NLS_DATE_FORMAT='DD-MON-RR' の場合 - このクエリは正常に機能します。

  2. NLS_DATE_FORMAT='MM-DD-YYYY' を使用すると、エラーが発生しますORA-01858: a non-numeric character was found where a numeric was expected

このクエリが失敗する理由についての手がかりはありますか? クエリを DATE 形式に依存させることはできません。

4

2 に答える 2

3

add_months を呼び出すときに to_char を実行するのはなぜですか。次のような日付を渡す必要があります

SELECT to_char(last_day(add_months(to_date('01-02-2013','dd-mm-yyyy'),
    ,-1)) + 1,'dd-mm-yyyy') FROM dual;
于 2013-02-18T18:26:27.337 に答える
2

add_months()呼び出しで、暗黙的な文字から日付への変換があります。渡す引数は、日付ではなく文字列です。内部にあるのto_char()は冗長であり、 NLS_DATE_FORMAT がその中で使用している形式と一致しない場合にエラーが発生しますto_char():

SELECT to_char(last_day(add_months(to_date('01-02-2013','dd-mm-yyyy'),-1)) + 1,
    'dd-mm-yyyy') FROM dual;

私はあなたが何をしているのか完全にはわかりません...その日付が入っている月の最初の日が必要な場合は、これを行うことができます:

SELECT to_char(trunc(to_date('01-02-2013', 'dd-mm-yyyy'), 'MM'),
    'dd-mm-yyyy') FROM dual;

これは、TRUNC(date)関数を使用して、月の初めに効果的に切り捨てます。

于 2013-02-18T18:27:15.880 に答える