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');
取得時のパフォーマンスを考えて、開始日だけではなく終了日の値も必須項目として、令和の終了日は 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
@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' 日'
こんな感じで使うことができます。