SQLで元号と和暦日付を取得する [SQLServer]

SQLで和暦の元号と日付を取得するサンプルです。

元号を取得する

元号はSQLServerの標準機能(関数など)で取得することはできないので、自分で元号を取得するSQLを記述する必要があります。
元号の取得は指定された日付がどの範囲にあるかを判別して元号の漢字を返すものを作成します。
元号は「明治」「大正」「昭和」「平成」「令和」の5種類に対応します。
明治は1868年09月08日~1912年07月29日、大正は1912年07月30日~1926年12月24日、昭和は1926年12月25日~1989年01月07日、平成は1989年01月08日~2019年04月30日、令和は2019年05月01日~9999年12月31日までをそれぞれの範囲として元号を返します。
SQLは以下のようになります。

実行結果

元号取得結果
上記のSQLでは、指定された日付を「@DATE」として、@DATEがどの元号の範囲に属しているかをCASE式で判断しています。

和暦日付を取得する

和暦の元号は上記の日付の範囲で取得できますので、元号を含めた和暦日付を取得します。
今回は元号の一覧を一旦一時テーブルに保持し、和暦日付を取得する対象の日付を一時テーブルに照合して元号を取得して、和暦日付を取得することにします。
以下サンプルのSQLです。

実行結果

和暦日付取得結果

和暦日付の取得を関数にする

最後に和暦日付を取得するSQLをユーザー定義関数にしておきます。
SQLServerのユーザー定義関数は、何度も使い回せるので便利です。
上記の和暦日付の取得サンプルでは、一時テーブルを作成して元号を保持しましたが、ここではテーブル型の変数を定義して元号を保持することにします。

和暦日付取得関数の作成

上記の関数は、引数に和暦日付を取得する対象の日付と、年月の書式を取ります。
年月の書式は「’md’」が指定されたの場合は「’M月d日’」形式、その他は「’MM月dd日’」形式の年月を返します。
年の部分は1年の場合には「元年」に変換しています。(令和1年 ⇒ 令和元年)

和暦日付の取得

和暦日付を取得する関数ができたので、関数を呼び出して和暦日付を取得します。

実行結果

和暦日付取得関数実行結果

和暦日付を書式を指定して取得することができました。

関数を呼び出す場合はスキーマ(dbo)が必要なので注意してください。

関連情報補足

本記事のINSERT INTOステートメントでは、複数のレコードを1回のSQLで一括挿入する形式で記述しています。
1回のINSERTで複数行のレコードをテーブルに挿入する方法については、以下の記事を参照してください。

1回のINSERT(インサートSQL)で複数行のレコードを一括挿入(追加)する
SQLServerやMySQLなどのデータベースで、テーブルにレコードをINSERT文使用して追加するには、通常は以下のように記述します。 ...