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