ORA-01846
ORA-01846: 指定した曜日が無効です。、SQLエンジンは現在のNLS_DATE_LANGUAGEで入力文字列の週の日の値を認識できません。この投稿では、以下に示すORA-01846のエラーパターンについて説明します。
ORA-01846 週の比類のない日の値
[oracle@test ~]$ export NLS_LANG=Japanese_Japan.UTF8
[oracle@test ~]$ sqlplus /nolog
...
SQL> conn hr/hr
Connected.
SQL> set heading off;
SQL> select value from v$nls_parameters where parameter = 'NLS_DATE_LANGUAGE';
JAPANESE
週の曜日の値に何も問題がないと思われるかもしれませんが、使用した曜日の値はOracleによって受け入れられない場合があります。例を見てみましょう。
次に、TO_DATE関数で「きんようび」という用語を使用しました。 これは日本語で「金曜日」も意味します。
SQL> select TO_DATE('2019-08-30, きんようび', 'YYYY-MM-DD, Day') from dual;
select TO_DATE('2019-08-30, きんようび', 'YYYY-MM-DD, Day') from dual
*
行1でエラーが発生しました。:
ORA-01846: 指定した曜日が無効です。
週の有効な日の値はどこにありますか?
実際、「きんようび」も日本語での金曜日の正しい表現ですが、Oracleには無効です。このようなエラーパターンを解決するには、異なるNLS_DATE_LANGUAGEの有効で正しい曜日の値を知る必要があります。この場合、「きんようび」は有効ではなく、「金曜日」は有効です。
SQL> select TO_DATE('2019-08-30, 金曜日', 'YYYY-MM-DD, Day') from dual;
19-08-30
ORA-01846 スペルミスのある曜日の値
何らかの理由で、次のようにステートメントで週の外国の日の値を使用する場合があります。
SQL> select TO_DATE('2019-08-30, 全曜日', 'YYYY-MM-DD, Day') from dual;
select TO_DATE('2019-08-30, 全曜日', 'YYYY-MM-DD, Day') from dual
*
行1でエラーが発生しました。:
ORA-01846: 指定した曜日が無効です。
上記の例では、「金曜日」のスペルを別のものと間違えたため、SQLエンジンは週の日の値を認識できません。解決策は簡単です。スペルを再確認して修正してください。
何も問題がなければ、入力文字列をテキストエディタに貼り付けて、スペルチェックを実行する必要があります。たとえば、Notepad ++のスペルチェッカープラグイン。
SQL> select TO_DATE('2019-08-30, 金曜日', 'YYYY-MM-DD, Day') from dual;
19-08-30
ORA-01846 週の外国の日の値
何らかの理由で、次のようにステートメントで週の外国の日の値を使用する場合があります。
SQL> select TO_DATE('2019-08-30, Vendredi', 'YYYY-MM-DD, Day') from dual;
select TO_DATE('2019-08-30, Vendredi', 'YYYY-MM-DD, Day') from dual
*
行1でエラーが発生しました。:
ORA-01846: 指定した曜日が無効です。
現在のNLS_DATE_LANGUAGE(日本語)では、SQLエンジンは「Vendredi」の意味を知りません。NLSパラメータオプションを追加して、翻訳方法を伝える必要があります。しかし、次の質問は、それを翻訳するためにどの言語を使用すべきかということです。
正しい言語はどこにありますか?
繰り返しますが、文字列の翻訳に使用するNLS_DATE_LANGUAGEをマッピングするには、異なる言語の有効な曜日の値を確認する必要があります。したがって、「Vendredi」はフランス語で金曜日です。
SQL> select TO_DATE('2019-08-30, Vendredi', 'YYYY-MM-DD, Day', 'NLS_DATE_LANGUAGE=FRENCH') from dual;
19-08-30
ステートメントで非常に一般的な英語の用語「Friday」を使用していても、ORA-01846の場合は日本語環境で翻訳する必要があることに注意してください。
SQL> select TO_DATE('2019-08-30, Friday', 'YYYY-MM-DD, Day', 'NLS_DATE_LANGUAGE=AMERICAN') from dual;
19-08-30
文字列を日付値に変換する方法をよりよく理解するには、次を確認できます。Oracle TO_DATE関数の例。