NLS_CALENDAR (Japanese Imperial) を令和に対応させる

OTN 開発者ライセンスおよび Express Edition (XE) の Oracle の日付型を 2019年5月1日から変更される元号 令和 に対応させる。
XE に関しては新しいリリースが出ることを期待します。
(製品版を利用している方は 最新の公式のサポート情報 を使用して対応してください)

{ORACLE_HOME}/nls (※1) に以下のファイルを置く。

lxecal.nlt ファイル (Linux / Windows 共用)

DEFINE calendar
	calendar_name = "Japanese Imperial"
	DEFINE calendar_era
		era_full_name = CEE1CFC2       -- 令和(EUC hex)
		era_abbr_name = 52             -- R
		start_date = "MAY-01-2019 AD"  -- 元年
		-- end_date = "DEC-31-9999 AD"
		ENDDEFINE calendar_era
ENDDEFINE calendar

lxegen 組み込みコマンドで lxecal.nlt を lxecalji.nlb にコンパイルする。(XE 版にもコマンドあり)

(※1) テキストファイルおよびコンパイル後のファイルはカレントディレクトリではなく $ORACLE_HOME/nls ディレクトリが使用される。 {ORACLE_HOME}/nls に lxecal.nlt ファイルが存在しない場合 LXE-00200: Cannot open calendar external file エラーとなる。

Oracle の再起動にて完了。

確認用 SQL

select
 to_char(
   date '2019-04-30',
   'e.yy-mm-dd', 'NLS_CALENDAR=''JAPANESE IMPERIAL'''
 ) "cur_abbr_era",
 to_char(
   date '2019-04-30',
   'eeyy"年"mm"月"dd"日"', 'NLS_CALENDAR=''JAPANESE IMPERIAL'''
 ) "cur_full_era",
 to_char(
   date '2019-05-01',
   'e.yy-mm-dd', 'NLS_CALENDAR=''JAPANESE IMPERIAL'''
 ) "next_full_era",
 to_char(
   date '2019-05-01',
   'eeyy"年"mm"月"dd"日"', 'NLS_CALENDAR=''JAPANESE IMPERIAL'''
 ) "next_full_era"
from dual;
 
cur_abbr_era     cur_full_era         next_abbr_era    next_full_era
---------------- -------------------- ---------------- --------------------
H.31-04-30       平成31年04月30日     R.01-05-01       令和01年05月01日

lxecal.nlt 補足

{ORACLE_HOME}/nls にすでに同名のファイルがある場合、別の暦で lxegen が使用されているため
使用中の lxecal.nltファイルを入手して上記の内容を追加して使用する。Oracle のインストール直後の状態ではどちらのファイルも存在していない。

行コメントは "--"
era_full_name は元号名の EUC のバイナリ文字列 (Windows版でも)
era_abbr_name は元号の略名(平成は H) の ASCII のバイナリ文字列

era_full_name / era_abbr_name のバイナリ文字列取得 SQL

select
  UTL_I18N.STRING_TO_RAW ('令和', 'JA16EUC') era_full_name ,
  UTL_I18N.STRING_TO_RAW ('R', 'JA16EUC') era_abbr_name
from dual;
 
ERA_FULL_NAME        ERA_ABBR_NAME
-------------------- ----------------
CEE1CFC2             52

{ORACLE_HOME}/nls は
Windows 版 Oracle Database 18c eXpress Edition の場合の例

  • C:\app\oracle\product\18.0.0\dbhomeXE\nls

Linux 版の Oracle 12c (SE/EE) 場合の例

  • /u01/app/oracle/product/12.2.0/dbhome_1/nls

和暦・西暦変換確認用 SQL

西暦から和暦

select
 to_char(
   to_date('2019-04-30', 'YYYY-MM-DD', 'NLS_CALENDAR=''GREGORIAN'''),
   'eeyy"年"mm"月"dd"日"', 'NLS_CALENDAR=''JAPANESE IMPERIAL'''
 ) "平成",
 to_char(
   to_date('2019-05-01', 'YYYY-MM-DD', 'NLS_CALENDAR=''GREGORIAN'''),
   'eeyy"年"mm"月"dd"日"', 'NLS_CALENDAR=''JAPANESE IMPERIAL'''
 ) "令和"
from dual;
 
平成                 令和
-------------------- --------------------
平成31年04月30日     令和01年05月01日

和暦から西暦

SQL> select
  2    to_date('R.01-05-01', 'E.yy-mm-dd', 'NLS_CALENDAR=''JAPANESE IMPERIAL''') R1,
  3    to_date('令和02-05-01', 'EEyy-mm-dd', 'NLS_CALENDAR=''JAPANESE IMPERIAL''') R2
  4  from dual;
 
R1         R2
---------- ----------
2019-05-01 2020-05-01
 


関連事項

日本オラクル
■ 日本オラクル 株式会社
■ オラクルマスター資格 (オラクルマスターとは
■ オラクルサポートセンター