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は以下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
-- 元号を取得する DECLARE @DATE date; SET @DATE = GETDATE(); SELECT CASE WHEN @DATE BETWEEN '1868-09-08' AND '1912-07-29' THEN '明治' WHEN @DATE BETWEEN '1912-07-30' AND '1926-12-24' THEN '大正' WHEN @DATE BETWEEN '1926-12-25' AND '1989-01-07' THEN '昭和' WHEN @DATE BETWEEN '1989-01-08' AND '2019-04-30' THEN '平成' WHEN @DATE BETWEEN '2019-05-01' AND '9999-12-31' THEN '令和' ELSE '' END AS ERA_DATE; |
上記のSQLでは、指定された日付を「@DATE」として、@DATEがどの元号の範囲に属しているかをCASE式で判断しています。
和暦日付を取得する
和暦の元号は上記の日付の範囲で取得できますので、元号を含めた和暦日付を取得します。
今回は元号の一覧を一旦一時テーブルに保持し、和暦日付を取得する対象の日付を一時テーブルに照合して元号を取得して、和暦日付を取得することにします。
以下サンプルのSQLです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
-- 一時テーブルを作成する CREATE TABLE #JAPANESE_ERA ( ERA_ID tinyint NOT NULL, ERA_NAME nvarchar(2) NOT NULL, BEGIN_DATE varchar(10) NOT NULL, END_DATE varchar(10) NOT NULL, PRIMARY KEY (ERA_ID) ); -- 一時テーブルに元号データを挿入する INSERT INTO #JAPANESE_ERA (ERA_ID, ERA_NAME, BEGIN_DATE, END_DATE) VALUES (1, N'明治', '1868-09-08', '1912-07-29'), (2, N'大正', '1912-07-30', '1926-12-24'), (3, N'昭和', '1926-12-25', '1989-01-07'), (4, N'平成', '1989-01-08', '2019-04-30'), (5, N'令和', '2019-05-01', '9999-12-31'); -- 和暦日付を取得する日付 DECLARE @DATE DATE = GETDATE(); -- 元号 DECLARE @ERA_NAME nvarchar(2); -- 元号の年 DECLARE @ERA_YEAR tinyint; -- 大正の元号を取得 SELECT @ERA_NAME = ERA_NAME, @ERA_YEAR = DATEDIFF(yy, BEGIN_DATE, @DATE) + 1 FROM #JAPANESE_ERA WHERE @DATE BETWEEN BEGIN_DATE AND END_DATE; -- 和暦日付の年 DECLARE @ERA_DATE_YEAR nvarchar(2); SET @ERA_DATE_YEAR = CASE WHEN @ERA_YEAR = 1 THEN N'元' ELSE CAST(@ERA_YEAR AS NVARCHAR) END + N'年'; -- 和暦日付の月日 DECLARE @ERA_DATE_MONTH_DATE nvarchar(6); SET @ERA_DATE_MONTH_DATE = FORMAT(@DATE, N'MM月dd日'); -- 和暦日付を取得 SELECT @ERA_NAME + @ERA_DATE_YEAR + @ERA_DATE_MONTH_DATE; -- 一時テーブルを削除する DROP TABLE #JAPANESE_ERA; |
和暦日付の取得を関数にする
最後に和暦日付を取得するSQLをユーザー定義関数にしておきます。
SQLServerのユーザー定義関数は、何度も使い回せるので便利です。
上記の和暦日付の取得サンプルでは、一時テーブルを作成して元号を保持しましたが、ここではテーブル型の変数を定義して元号を保持することにします。
和暦日付取得関数の作成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
-- 関数の削除 DROP FUNCTION IF EXISTS GET_ERA_DATE; GO -- 関数の作成 CREATE FUNCTION GET_ERA_DATE ( @DATE DATE, @FORMAT NVARCHAR(4) = null ) RETURNS NVARCHAR(50) AS BEGIN -- テーブル変数を定義する DECLARE @JAPANESE_ERA TABLE ( ERA_ID tinyint NOT NULL PRIMARY KEY, ERA_NAME nvarchar(2) NOT NULL, BEGIN_DATE varchar(10) NOT NULL, END_DATE varchar(10) NOT NULL ); -- テーブル変数に元号データを挿入する INSERT INTO @JAPANESE_ERA (ERA_ID, ERA_NAME, BEGIN_DATE, END_DATE) VALUES (1, N'明治', '1868-09-08', '1912-07-29'), (2, N'大正', '1912-07-30', '1926-12-24'), (3, N'昭和', '1926-12-25', '1989-01-07'), (4, N'平成', '1989-01-08', '2019-04-30'), (5, N'令和', '2019-05-01', '9999-12-31'); -- 元号 DECLARE @ERA_NAME nvarchar(2); -- 元号の年 DECLARE @ERA_YEAR tinyint; -- 大正の元号を取得 SELECT @ERA_NAME = ERA_NAME, @ERA_YEAR = DATEDIFF(yy, BEGIN_DATE, @DATE) + 1 FROM @JAPANESE_ERA WHERE @DATE BETWEEN BEGIN_DATE AND END_DATE; -- 和暦日付の年 DECLARE @ERA_DATE_YEAR nvarchar(2); SET @ERA_DATE_YEAR = CASE WHEN @ERA_YEAR = 1 THEN N'元' ELSE CAST(@ERA_YEAR AS NVARCHAR) END + N'年'; -- 和暦日付の月日 DECLARE @ERA_DATE_MONTH_DATE nvarchar(6); SET @ERA_DATE_MONTH_DATE = CASE LOWER(@FORMAT) WHEN 'md' THEN FORMAT(@DATE, N'M月d日') ELSE FORMAT(@DATE, N'MM月dd日') END; -- 和暦日付 DECLARE @ERA_DATE nvarchar(20); SET @ERA_DATE = @ERA_NAME + @ERA_DATE_YEAR + @ERA_DATE_MONTH_DATE; -- 和暦日付を返す RETURN @ERA_DATE; END GO |
上記の関数は、引数に和暦日付を取得する対象の日付と、年月の書式を取ります。
年月の書式は「’md’」が指定されたの場合は「’M月d日’」形式、その他は「’MM月dd日’」形式の年月を返します。
年の部分は1年の場合には「元年」に変換しています。(令和1年 ⇒ 令和元年)
和暦日付の取得
和暦日付を取得する関数ができたので、関数を呼び出して和暦日付を取得します。
1 2 3 4 5 |
-- GET_ERA_DATE関数を使用して和暦日付を取得する SELECT dbo.GET_ERA_DATE(GETDATE(), 'MMDD') AS 'MMDD_FORMAT', dbo.GET_ERA_DATE(GETDATE(), 'MD') AS 'MD_FORMAT', dbo.GET_ERA_DATE(GETDATE(), DEFAULT) AS 'DEFAULT_FORMAT'; |
和暦日付を書式を指定して取得することができました。
関連情報補足
本記事のINSERT INTOステートメントでは、複数のレコードを1回のSQLで一括挿入する形式で記述しています。
1回のINSERTで複数行のレコードをテーブルに挿入する方法については、以下の記事を参照してください。