データベースを扱う際、顧客向けレポートや帳票で「平成」「令和」といった和暦表示が求められることがあります。
SQL Serverでは標準機能を活用して簡単に西暦から和暦に変換できるので、本記事では初級者向けにその手順をわかりやすく解説します。
前提条件
- SQL Server 2012以降がインストールされていること
- 基本的なT-SQLの知識(SELECTやCASEなど)があること
- 日付型(DATE型やDATETIME型)を扱ったことがあること
日付のフォーマット
CONVERT関数によるフォーマット
SQL Serverで最も古くから使われてきた方法が CONVERT 関数です。
-- 現在日時を YYYY-MM-DD 形式で取得
SELECT CONVERT(varchar(10), GETDATE(), 23) AS FormattedDate;
- 第1引数:出力先の文字列型(例:varchar(10))
- 第2引数:変換対象(例:GETDATE())
- 第3引数:スタイル番号(例:23 → YYYY-MM-DD)
主なスタイル番号例
スタイル番号 | 表示例 | 説明 |
---|---|---|
101 | 12/31/2025 | 米国標準 (MM/DD/YYYY) |
112 | 20251231 | 連続数字 (YYYYMMDD) |
120 | 2025-12-31 23:59:59 | ODBC 標準 (YYYY-MM-DD hh:mi:ss) |
23 | 2025-12-31 | ISO 標準 (YYYY-MM-DD) |
FORMAT関数によるフォーマット(SQL Server 2012以降)
SQL Server 2012以降で使える FORMAT 関数は .NET のフォーマット文字列が利用でき、柔軟性が高いです。
-- 現在日時を「2025年12月31日 23時59分59秒」形式で取得
SELECT FORMAT(GETDATE(), N'yyyy年MM月dd日 HH時mm分ss秒', 'ja-JP') AS JPDate;
- 第1引数:変換対象(例:GETDATE())
- 第2引数:フォーマット文字列(例:yyyy年MM月dd日)
- 第3引数:ロケール(例:’ja-JP’ 日本語ロケール)
主な書式指定子例
書式 | 意味 | 出力例 |
---|---|---|
yyyy | 4桁の西暦年 | 2025 |
MM | 2桁の月(01〜12) | 04 |
dd | 2桁の日(01〜31) | 09 |
HH | 24時間制の時(00〜23) | 17 |
hh | 12時間制の時(01〜12) | 05 |
mm | 分(00〜59) | 07 |
ss | 秒(00〜59) | 45 |
gg | 元号 | 令和 |
注意点とパフォーマンス
- 文字列変換のコスト
FORMAT は .NET ベースの処理のため、CONVERT より若干遅い傾向があります。大量データを一度に処理する場合、パフォーマンスを考慮して使い分けましょう。 - ロケール依存
FORMAT でロケールを指定しないと、サーバーの既定ロケールが適用されます。異なる言語・文化圏向けにアプリケーションを提供する場合は明示的な指定を忘れずに。 - 集計・検索時の留意
日付を文字列化すると、元の日時型の持つ演算や比較ができなくなります。フォーマットは「最終出力用」にとどめ、可能な限り内部処理は日時型のまま行いましょう。
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で西暦の年月日から和暦を求める方法”は完璧です!