開発時に発生するエラー

ORA-01822: 年代書式コードがこのカレンダでは無効です

日付文字列に和暦を用いて日付を表現または変換しようとするときに発生する。

原因

デフォルトの環境においては日付処理用のカレンダはグレゴリアン暦(Gregorian) が用いられ、
このカレンダの設定は NLS_CALENDAR 初期化パラメータ によって行われる。

この使用するカレンダと入力パラメータの書式が一致していないことによってエラーが発生する。

対応(その1)

NLS_CALENDAR を ALTER SESSION で和暦(Japanese Imperial) に変更する。(大文字小文字は関知しなくてよい)

SQL> ALTER SESSION SET NLS_CALENDAR='Japanese Imperial';
セッションが変更されました。
 
SQL> SELECT TO_DATE('H19-01-01', 'EYY-MM-DD') from DUAL;
TO_DATE('H19-01-01','EYY-MM-DD')
------------------------------------------
平成19年01月01日
 
SQL> ALTER SESSION SET NLS_CALENDAR='GREGORIAN';
セッションが変更されました。

対応(その2)

TO_CHARTO_DATE の書式モデルに E または EE を使用しながら nls_param 引数に NLS_CALENDAR を設定する。
但し、これはマニュアルの 書式モデル(日付) において E, EE と TO_DATE の併用を許可していない状態なので気をつけたほうがよい。(Oracle 10g R2)

SQL> ALTER SESSION SET NLS_CALENDAR='GREGORIAN';
セッションが変更されました。
 
-- NLS_DATE_FORMAT がデフォルトに設定されるので再設定
SQL> ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS';
セッションが変更されました。
 
SQL> SELECT
  2    TO_DATE('平成19-01-01', 'EEYY-MM-DD',
  3            'NLS_CALENDAR=''JAPANESE IMPERIAL''') "和暦⇒西暦"
  4  FROM DUAL;
 
和暦⇒西暦
-------------------
2007-01-01 00:00:00

TO_DATE において NLS_CALENDAR が使用できるバージョンは限られているかもしれない。(以前のバージョンでは利用できなかったような気がする。Oracle 10g R2 で動作確認)



関連事項

一覧ページへ戻る

OTN (Oracle Technology Network)によるエラーメッセージによる情報だけでは、対処に困ったエラーについてのプラクティスです。
ベスト・プラクティスというわけではないので、書いてあることに固執しないで広い視野でエラー対応してください。

ORA-01822の関連トピックス

日本オラクル
■ 日本オラクル 株式会社
■ オラクルマスター資格 (オラクルマスターとは
■ Oracle Web セミナー