T-SQL: 誕生日から年齢を取得する
誕生日から年齢を取得するには?
誕生日から計算して年齢を取得したいような時ありませんか?
組み込み関数はないので、自分で工夫して取得しなければならず、本当にさまざまな方法があると思います。
ほとんどのケースで OK なスクリプトでよければ、かなりシンプルにできると思いますが、今回は以下の条件をカバーしたスクリプトの一例をご紹介したいと思います。
- 誕生日が既に来ている場合は、[年齢を取得したい年] - [誕生日の年]
- 誕生日がまだきていない場合は、[年齢を取得したい年] - [誕生日の年] - 1
- 2 月 29 日生まれの人は、[年齢を取得したい年]がうるう年でない年には 2 月 28 日を誕生日とみなす (日本の行政手続はそうなっているそうなので)
誕生日から年齢を取得するクエリー
誕生日から年齢を取得するクエリーは次の通りです。
DECLARE @Student TABLE ( StudentID INT NOT NULL IDENTITY(1,1) PRIMARY KEY, FirstName VARCHAR(50) NULL, Birthday DATE NULL ); INSERT INTO @Student (FirstName, Birthday) VALUES ('Hanako' ,'1991-02-28'), ('Yuko', '1991-03-01'), ('Takao', '1992-02-28'), ('Hiroki', '1992-02-29'), ('Yuka', '1992-03-01'), ('Mari', '1992-12-15'); -------------------------------------------- DECLARE @ProcessDate DATE = GETDATE(); SELECT StudentID, FirstName, Birthday, @ProcessDate AS ProcessDate, DATEDIFF(yy, Birthday, @ProcessDate) AS YearDifference, CASE WHEN @ProcessDate >= DATEADD(yy, DATEDIFF(yy, Birthday, @ProcessDate), Birthday) THEN DATEDIFF(yy, Birthday, @ProcessDate) ELSE DATEDIFF(yy, Birthday, @ProcessDate) - 1 END AS Age FROM @Student;
[ 実行結果 ]
いろいろありますが、年齢の取得に関係する箇所は、青で囲まれた部分です。
- DATEDIFF(yy, Birthday, @ProcessDate) で [年の差分] を取得
- DATEADD(yy, DATEDIFF(yy, Birthday, @ProcessDate), Birthday) で、誕生日に [年の差分] を加えて [今年の誕生日] を取得
- @ProcessDate が [今年の誕生日] 以降の場合は、[年の差分] を、そうでなければ [年の差分] - 1 を年齢としています
[今年の誕生日] を取得する箇所のスクリプトは、Birthday が 2 月 29 日で、@ProcessDate がうるう年でない場合、自動的に 2 月 28 日に変換してくれます。
@ProcessDate をいろいろ変更して、期待通りに動くかテストしてみました。
うるう年である 2016 年 2 月 28 日 ~ 3 月 1 日を @ProcessDate に設定した結果は以下の通りです。
[ @ProcessDate = '2016-02-28' の 実行結果 ]
[ @ProcessDate = '2016-02-29' の 実行結果 ]
[ @ProcessDate = '2016-03-01' の 実行結果 ]
誕生日が 1992-02-29 の人は 2016-02-29 で 年齢が 24 才になっています。
次は、うるう年ではない 2017 年 2 月 27 日 ~ 3 月 1 日を @ProcessDate に設定した結果は以下の通りです。
[ @ProcessDate = '2017-02-27' の 実行結果 ]
[ @ProcessDate = '2017-02-28' の 実行結果 ]
[ @ProcessDate = '2017-03-01' の 実行結果 ]
誕生日が 1992-02-29 の人は 2016-02-28 で 年齢が 25 才になっていますね!