SQL Serverで西暦の日付を和暦に変換する方法

データベースを扱う際、顧客向けレポートや帳票で「平成」「令和」といった和暦表示が求められることがあります。

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. 演習1
    テーブルEmployeesにあるBirthDate列(DATE型)を、FORMAT関数を用いて「令和…年…月…日」形式で表示するクエリを書いてください。
  2. 演習2
    CASE式を使い、任意のDATE型変数@dから和暦表示(元号+年+月+日)を取得するSQLを記述してください。
    ただし、令和・平成・昭和の3元号は対応し、それ以前は「それ以前」と表示します。
  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で西暦の年月日から和暦を求める方法”は完璧です!