Oracleの新元号対応
株式会社テイク-ワンのM.Sです。
現場では、データベースとして、Oracleを利用しています。
忘れたころにやってくる元号対応!対応方法について、紹介します。
公式な新元号への対応
和暦表示するために使用する元号の日時書式「EE」や「E」は、Oracle内のカレンダー「Japanese Imperial」を参照しています。
データベース、クライアントで使用しているプラットフォーム、バージョンに適合するパッチを適用します。
※My Oracle Supportのアカウントが必要
パッチを待つ間の対応①lxegen ユーティリティを使用して追加します。
1.追加するEUC文字コードを確認する。
select
DUMP(CONVERT('令和','JA16EUC','AL32UTF8'),16) AS EE,
DUMP(CONVERT('R','JA16EUC','AL32UTF8'),16) AS E
from
dual;
2.{ORACLE_HOME}/nls の定義ファイル(テキストファイル) lxecal.nlt をテキストエディタで開く。なければ作る。
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
3.コマンドプロンプトで「lxegen」コマンドを起動し、「lxecal.nlt」をコンパイルする。「lxecalji.nlb」が作成されます。
4.Oracleサービスを再起動する。新元号が使用可能となります。
select
to_char(sysdate,'EEYY/MM/DD','nls_calendar = ''Japanese Imperial''') as EE,
to_char(sysdate,'EYY/MM/DD','nls_calendar = ''Japanese Imperial''') as E
from
dual;
パッチを待つ間の対応②Functionを作成します。
1.Functionを作成する。
CREATE OR REPLACE FUNCTION WAREKI_EE(in_YYYYMMDD IN date) RETURN VARCHAR2
IS out_YYYYMMDD VARCHAR2(20);
BEGIN
SELECT
(CASE WHEN to_char(in_YYYYMMDD,'YYYYMMDD') > '20190430' THEN '令和' WHEN to_char(in_YYYYMMDD,'YYYYMMDD') > '19890107' THEN '平成'
WHEN to_char(in_YYYYMMDD,'YYYYMMDD') > '19261224' THEN '昭和' WHEN to_char(in_YYYYMMDD,'YYYYMMDD') > '19120729' THEN '大正'
WHEN to_char(in_YYYYMMDD,'YYYYMMDD') > '18680124' THEN '明治' END ||
CASE WHEN to_char(in_YYYYMMDD,'YYYYMMDD') > '20190430' THEN to_char(in_YYYYMMDD,'YYYY') - 2018
WHEN to_char(in_YYYYMMDD,'YYYYMMDD') > '19890107' THEN to_char(in_YYYYMMDD,'YYYY') - 1988
WHEN to_char(in_YYYYMMDD,'YYYYMMDD') > '19261224' THEN to_char(in_YYYYMMDD,'YYYY') - 1925
WHEN to_char(in_YYYYMMDD,'YYYYMMDD') > '19120729' THEN to_char(in_YYYYMMDD,'YYYY') - 1911
WHEN to_char(in_YYYYMMDD,'YYYYMMDD') > '18680124' THEN to_char(in_YYYYMMDD,'YYYY') - 1867
END || '年' || to_char(in_YYYYMMDD,'MM') || '月' || to_char(in_YYYYMMDD,'DD') || '日') INTO out_YYYYMMDD
FROM dual;
RETURN out_YYYYMMDD;
END;
/
CREATE OR REPLACE FUNCTION WAREKI_E(in_YYYYMMDD IN date) RETURN VARCHAR2
IS out_YYYYMMDD VARCHAR2(20);
BEGIN
SELECT
(CASE WHEN to_char(in_YYYYMMDD,'YYYYMMDD') > '20190430' THEN 'R' WHEN to_char(in_YYYYMMDD,'YYYYMMDD') > '19890107' THEN 'H'
WHEN to_char(in_YYYYMMDD,'YYYYMMDD') > '19261224' THEN 'S' WHEN to_char(in_YYYYMMDD,'YYYYMMDD') > '19120729' THEN 'T'
WHEN to_char(in_YYYYMMDD,'YYYYMMDD') > '18680124' THEN 'M' END ||
CASE WHEN to_char(in_YYYYMMDD,'YYYYMMDD') > '20190430' THEN to_char(in_YYYYMMDD,'YYYY') - 2018
WHEN to_char(in_YYYYMMDD,'YYYYMMDD') > '19890107' THEN to_char(in_YYYYMMDD,'YYYY') - 1988
WHEN to_char(in_YYYYMMDD,'YYYYMMDD') > '19261224' THEN to_char(in_YYYYMMDD,'YYYY') - 1925
WHEN to_char(in_YYYYMMDD,'YYYYMMDD') > '19120729' THEN to_char(in_YYYYMMDD,'YYYY') - 1911
WHEN to_char(in_YYYYMMDD,'YYYYMMDD') > '18680124' THEN to_char(in_YYYYMMDD,'YYYY') - 1867
END || '/' || to_char(in_YYYYMMDD,'MM') || '/' || to_char(in_YYYYMMDD,'DD')) INTO out_YYYYMMDD
FROM dual;
RETURN out_YYYYMMDD;
END;
/
2.新元号が使用可能となります。
select
WAREKI_EE(to_char(sysdate,'YYYYMMDD')) as EE,
WAREKI_E(to_char(sysdate,'YYYYMMDD')) as E
from
dual;
Oracle以外にもMySQL、SQL Server、PostgreSQLなど様々なRDBがあります。
使用しているRDB、環境によって対応方法は異なります。
他の対応は、また調べてみてください。