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、環境によって対応方法は異なります。
他の対応は、また調べてみてください。

前へ

IT資格合格体験記 CISCO CCNA試験 K.Gの場合

次へ

IT資格合格体験記 AWS Certified Developer - Associate試験 T.Tの場合