T-SQL - 西暦の日付を和暦(元号)の日付に変換するユーザー定義関数

西暦の日付を和暦(元号)の日付に変換する

西暦の日付を和暦(元号)の日付に変換したいような時はないでしょうか。

.NET Framework のライブラリーには JapaneseCalendar クラスがあって、GetEra(DateTime) メソッドなどで元号の情報を取得できますが、SQL Server にはそのような便利な組み込み関数はありません。

SQL Server の CLR 関数を作成するという手もあるかもしれませんが、頻繁に変わる情報でもないので、元号のテーブル変数を含む西暦の日付を和暦(元号)の日付に変換するユーザー定義関数を作ってみました。

難しいことは何もしていないですが、どなたかの参考になれば幸いです。

西暦の日付を和暦(元号)の日付に変換するユーザー定義関数

まずは、元号一覧用に JapaneseEra テーブルを作って、データをインサートしておきます。

CREATE TABLE JapaneseEra (
   EraValue TINYINT NOT NULL PRIMARY KEY,
   EraName NVARCHAR(2) NOT NULL,
   EraAbbreviation CHAR(1) NOT NULL,
   EraStartDate DATE NOT NULL,
   EraEndDate DATE NOT NULL
);

INSERT INTO JapaneseEra
   (EraValue, EraName, EraAbbreviation, EraStartDate, EraEndDate)
VALUES 
   (1, N'明治', 'M', '1868-09-08', '1912-07-29'),
   (2, N'大正', 'T', '1912-07-30', '1926-12-24'),
   (3, N'昭和', 'S', '1926-12-25', '1989-01-07'),
   (4, N'平成', 'H', '1989-01-08', '2019-04-30'),
   (5, N'令和', 'R', '2019-05-01', '9999-12-31');

西暦の日付を和暦(元号)の日付に変換するユーザー定義関数 1

西暦の日付を和暦(元号)の日付に変換するユーザー定義関数 2

取得時のパフォーマンスを考えて、開始日だけではなく終了日の値も必須項目として、令和の終了日は DATE の最大値を設定しています。


そして、西暦の日付を和暦(元号)の日付に変換するユーザー定義関数は以下の通りです。

CREATE FUNCTION ufnGetEraDate (
   @InputDate DATE
)
RETURNS NVARCHAR(50)
AS
BEGIN

   DECLARE @EraDate NVARCHAR(50);

   DECLARE @EraName NVARCHAR(2),
           @EraYear TINYINT;

   SELECT  @EraName = EraName,
           @EraYear = DATEDIFF(yy, EraStartDate, @InputDate) + 1
   FROM    JapaneseEra WITH (NOLOCK)
   WHERE   @InputDate BETWEEN EraStartDate AND EraEndDate;

   SET @EraDate = @EraName
                  + CASE 
                     WHEN @EraYear = 1
                        THEN N'元'
                        ELSE N' ' + CAST(@EraYear AS NVARCHAR) + N' '
                     END 
                  + N'年'
                  + FORMAT(@InputDate, N' M 月 d 日');

   RETURN @EraDate;

END

西暦の日付を和暦(元号)の日付に変換するユーザー定義関数 3

@InputDate に西暦の日付を渡し、JapaneseEra テーブルから年号の情報を取得して、和暦の日付を作って返します。

日付が明治より前の年号の日付の場合は NULL が返ります。

FORMAT 関数は SQL Server 2012 以降でサポートされている組み込み関数です。 SQL Server 2012 より前の SQL Server をお使いの場合は、FORMAT(@InputDate, N' M 月 d 日') の代わりに例えば以下のような感じで、@InputDate から月と日を取り出して文字列を作ってください。
N' ' + CAST(MONTH(@InputDate) AS NVARCHAR(2)) + N' 月 ' 
+ CAST(DAY(@InputDate) AS NVARCHAR(2)) + N' 日'

こんな感じで使うことができます。

西暦の日付を和暦(元号)の日付に変換するユーザー定義関数 4

西暦の日付を和暦(元号)の日付に変換するユーザー定義関数 5

© 2010-2024 SQL Server 入門