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 才になっていますね!