データベースを扱う際、顧客向けレポートや帳票で「平成」「令和」といった和暦表示が求められることがあります。
SQL Serverでは標準機能を活用して簡単に西暦から和暦に変換できるので、本記事では初級者向けにその手順をわかりやすく解説します。
前提条件
- SQL Server 2012以降がインストールされていること
- 基本的なT-SQLの知識(SELECTやCASEなど)があること
- 日付型(DATE型やDATETIME型)を扱ったことがあること
FORMAT関数を使った和暦変換
SQL Server 2012以降では、.NET Frameworkのカルチャ情報を利用できるFORMAT関数が利用可能です。
日本語ロケール(ja-JP)と書式指定子ggで和暦の元号、yyで年、MMで月、ddで日を出力できます。
DECLARE @dt DATE = '2025-04-17';
SELECT
FORMAT(@dt, 'ggyy年MM月dd日', 'ja-JP') AS 和暦表示;
実行結果例
和暦表示 |
---|
令和07年04月17日 |
- gg:元号(令和、平成、昭和…)
- yy:和暦の年(07年など)
- MM:月(02月など)
- dd:日(05日など)
※表示例では7年を「07年」としています。必要に応じてg y年M月d日のように桁数を調整できます。
CASE式を使った手動変換(SQL Server 2012未満や.NET未使用環境向け)
もしFORMAT関数が使えない場合は、CASE式で元号の境界を判定し、年計算と文字列結合を行います。
DECLARE @dt DATE = '1990-05-20';
SELECT
CASE
WHEN @dt >= '2019-05-01' THEN '令和' + RIGHT('0' + CAST(YEAR(@dt) - 2018 AS varchar), 2)
WHEN @dt >= '1989-01-08' THEN '平成' + RIGHT('0' + CAST(YEAR(@dt) - 1988 AS varchar), 2)
WHEN @dt >= '1926-12-25' THEN '昭和' + RIGHT('0' + CAST(YEAR(@dt) - 1925 AS varchar), 2)
ELSE 'それ以前'
END
+ '年' + RIGHT('0' + CAST(MONTH(@dt) AS varchar), 2) + '月'
+ RIGHT('0' + CAST(DAY(@dt) AS varchar), 2) + '日'
AS 和暦表示;
- WHEN @dt >= ‘YYYY-MM-DD’:元号開始日で判定
- YEAR(@dt) – 開始年+1:和暦年を計算
- RIGHT(‘0’+…,2):ゼロ埋めで2桁表示
この方法は少し冗長ですが、.NETが使えない環境でも和暦変換が可能です。
ユーザー定義関数(UDF)の作成
複数箇所で使う場合や可読性を高めたい場合は、和暦変換ロジックを関数化しましょう。
CREATE FUNCTION dbo.fn_ToJapaneseEra(@dt DATE)
RETURNS NVARCHAR(20)
AS
BEGIN
DECLARE @era NVARCHAR(10), @year INT;
IF @dt >= '2019-05-01'
SET @era = '令和', @year = YEAR(@dt) - 2018;
ELSE IF @dt >= '1989-01-08'
SET @era = '平成', @year = YEAR(@dt) - 1988;
ELSE IF @dt >= '1926-12-25'
SET @era = '昭和', @year = YEAR(@dt) - 1925;
ELSE
SET @era = 'それ以前', @year = YEAR(@dt);
RETURN
@era
+ CASE WHEN @year < 10 THEN '0' + CAST(@year AS NVARCHAR) ELSE CAST(@year AS NVARCHAR) END
+ '年'
+ RIGHT('0' + CAST(MONTH(@dt) AS NVARCHAR), 2) + '月'
+ RIGHT('0' + CAST(DAY(@dt) AS NVARCHAR), 2) + '日';
END;
GO
使い方例
SELECT dbo.fn_ToJapaneseEra(OrderDate) AS 和暦注文日
FROM Sales.Orders;
まとめ
- SQL Server 2012以降:FORMAT(…, ‘ggyy年MM月dd日’, ‘ja-JP’) が最もシンプル
- それ以前のバージョン:CASE式で元号判定+文字列操作
- 再利用性向上:ユーザー定義関数化がおすすめ
演習問題
- 演習1
テーブルEmployeesにあるBirthDate列(DATE型)を、FORMAT関数を用いて「令和…年…月…日」形式で表示するクエリを書いてください。 - 演習2
CASE式を使い、任意のDATE型変数@dから和暦表示(元号+年+月+日)を取得するSQLを記述してください。
ただし、令和・平成・昭和の3元号は対応し、それ以前は「それ以前」と表示します。 - 演習3
上記のユーザー定義関数dbo.fn_ToJapaneseEraを作成したうえで、テーブルOrdersのOrderDateを関数を使って和暦表示に変換し、結果を取得するクエリを書いてください。
解答例
演習1 解答例
SELECT
EmployeeID,
FORMAT(BirthDate, 'ggyy年MM月dd日', 'ja-JP') AS 和暦生年月日
FROM Employees;
演習2 解答例
DECLARE @d DATE = '1985-10-15';
SELECT
CASE
WHEN @d >= '2019-05-01' THEN '令和' + CAST(YEAR(@d) - 2018 AS varchar)
WHEN @d >= '1989-01-08' THEN '平成' + CAST(YEAR(@d) - 1988 AS varchar)
WHEN @d >= '1926-12-25' THEN '昭和' + CAST(YEAR(@d) - 1925 AS varchar)
ELSE 'それ以前' + CAST(YEAR(@d) AS varchar)
END
+ '年' + RIGHT('0' + CAST(MONTH(@d) AS varchar), 2) + '月'
+ RIGHT('0' + CAST(DAY(@d) AS varchar), 2) + '日'
AS 和暦表示;
演習3 解答例
-- 関数作成(既に作成済みであれば省略可)
CREATE FUNCTION dbo.fn_ToJapaneseEra(@dt DATE)
RETURNS NVARCHAR(20)
AS
BEGIN
/* 先ほど示した関数定義をここに記述 */
END;
GO
-- 関数を使ったクエリ
SELECT
OrderID,
dbo.fn_ToJapaneseEra(OrderDate) AS 和暦注文日
FROM Orders;
本記事を参考に、ぜひご自身のプロジェクトでも西暦→和暦変換を実装してみてください。
初級編のステップを踏むことで、無理なく習得できるはずです。
これで“SQL Serverで西暦の年月日から和暦を求める方法”は完璧です!