元号が「令和」になって早5年。
コロナ禍を始め、いろいろな事がありまくりですが、まだ5年しかたっていないことに驚き…
さて、システム開発をしていると、平成〇年や令和〇年を西暦に変換する時(逆も然り)があるんですけど、
ハードコーディングでは何かと問題が出ることが多いんですよね。
そこで今回はハードコーディングではなく、
データベース・SQLを使って和暦→西暦に変換する方法をまとめてみました。
ハードコーディングの問題点
自分は主にC#でコーディングをしていますが、
C#にはJapaneseCalendarクラスが存在し、これを使用すれば和暦→西暦の変換はめちゃくちゃ簡単です。
using System.Globalization;
//JapaneseCalendarクラスを呼び出し
CultureInfo culture = new CultureInfo("ja-JP", true);
culture.DateTimeFormat.Calendar = new JapaneseCalendar();
//和暦→西暦に変換
DateTime year = DateTime.Parse("令和6年",culture);
string yearString = year.ToString("yyyy年"); //2024年に変換される
しかし、新しい元号が発表されてからOSに実装されるまでに多少のラグが存在します。
(調べたらWindows10で「令和」が適用されたのは2019年GWの前後だったそうです…)
実際に使用されるサーバーは頑なにWindowsUpdateを拒否していたり、
サポートがとっくの昔に終了したOSを使用していたりで、
元号がいつまでたってもOSに適用されないコンピュータも少なくないです。
そこで、データベースに年号の情報をまとめたテーブルを作成し、
それを使用して変換すればクローズドなシステムにも適用できるのでは?と考えました。
和暦→西暦変換の手順
データベースはOracle、MySQL、SQLServer等、何でもOKですが、
細かい書式はデータベースごとに異なるので、使用するデータベースに合わせてください。
(記事ではOracleベースで記述しています)
まずは、年号をまとめたテーブルを作成します。
Create Table 年号マスタ
(
年号ID number not null,
年号 varchar2(4),
開始年月日 date,
終了年月日 date,
作成日 date,
更新日 date,
CONSTRAINT 年号ID_pk primary key(年号ID)
)
今回は「大正」~「令和」までの4レコードを登録しました。
では、和暦→西暦に変換するSQLを作成します。
Select
TO_NUMBER(TO_CHAR(開始年月日,'YYYY')) + :EraYear - 1 As 西暦年
From 年号マスタ
Where 年号 = :EraName
開始年をと和暦の年を足して、そこから1を引けば、正しい西暦が求められますね。
パラメーターには下記の値を設定しています。
・:EraYear:和暦の年(元年の場合は’1′)
・:EraName:元号名
例として、今回は昭和元年の西暦を求めてみましょう。
パラメータに値を設定するとこんな感じ。
Select
TO_NUMBER(TO_CHAR(開始年月日,'YYYY')) + 1 - 1 As 西暦年
From 年号マスタ
Where 年号 = '昭和'
結果は…
ちゃんと1926年に変換されました!!
西暦→和暦に変換してみる
せっかくなので、逆パターン(西暦→和暦の変換)もやってみましょう。
Select 年号,
LPAD(TO_CHAR(TO_DATE(:Ymd),'YYYY') - TO_CHAR(開始年月日,'YYYY') + 1 ,2,'0') As 年
From 年号マスタ
Where 開始年月日 <= :Ymd
And 終了年月日 >= :Ymd
パラメーター「:Ymd」は入力した年月日。
入力された年月日がどの年号に属しているかを求め、
入力した年からその年号の開始年を引くと、和暦の年が出せます。
例えば、令和になる1か月前、2019/4/1であれば…
Select 年号,
LPAD(TO_CHAR(TO_DATE('2019/04/01'),'YYYY') - TO_CHAR(開始年月日,'YYYY') + 1 ,2,'0') As 年
From 年号マスタ
Where 開始年月日<= '2019/04/01'
And 終了年月日 >= '2019/04/01'
こんな感じで、平成31年に正しく変換されました。
まとめ
というわけで、今回はデータベースを活用した西暦と和暦の変換方法についてまとめました。
紹介したSQLをプログラムに組み込んでおけば、
今後もし年号が変わった場合でも、年号の情報をレコードに追加するだけで終わり。
元号の名前と開始日が発表されたら即適用可能です。
OSや言語のアップデートを待つ必要なんてありませんね。
実務ではOSに新しい元号が適用できない環境が多いのに、
ネットで調べてもJapaneseCalendarクラスなどのOSや言語のバージョンに依存する変換方法ばかりで、
クローズドな環境向けの変換方法はほとんど出てきませんでした。
(実際の環境はセキュリティ面からクローズドな環境で運用されるコンピューターが多いのに…)
まぁ実務では説明するまでもない当たり前の知識なのかもしれません…
しかしながら、「プログラミングやデータベースについて絶賛学習中!」という人や
「業務で使えるテクニックを学びたい!」という人の役に少しでも立てたなら幸いです。