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;

[ 実行結果 ]
T-SQL: 誕生日から年齢を取得する 1

いろいろありますが、年齢の取得に関係する箇所は、青で囲まれた部分です。

  1. DATEDIFF(yy, Birthday, @ProcessDate) で [年の差分] を取得
  2. DATEADD(yy, DATEDIFF(yy, Birthday, @ProcessDate), Birthday) で、誕生日に [年の差分] を加えて [今年の誕生日] を取得
  3. @ProcessDate が [今年の誕生日] 以降の場合は、[年の差分] を、そうでなければ [年の差分] - 1 を年齢としています

[今年の誕生日] を取得する箇所のスクリプトは、Birthday が 2 月 29 日で、@ProcessDate がうるう年でない場合、自動的に 2 月 28 日に変換してくれます。


@ProcessDate をいろいろ変更して、期待通りに動くかテストしてみました。

うるう年である 2016 年 2 月 28 日 ~ 3 月 1 日を @ProcessDate に設定した結果は以下の通りです。

[ @ProcessDate = '2016-02-28' の 実行結果 ]
T-SQL: 誕生日から年齢を取得する 2

[ @ProcessDate = '2016-02-29' の 実行結果 ]
T-SQL: 誕生日から年齢を取得する 3

[ @ProcessDate = '2016-03-01' の 実行結果 ]
T-SQL: 誕生日から年齢を取得する 4

誕生日が 1992-02-29 の人は 2016-02-29 で 年齢が 24 才になっています。


次は、うるう年ではない 2017 年 2 月 27 日 ~ 3 月 1 日を @ProcessDate に設定した結果は以下の通りです。

[ @ProcessDate = '2017-02-27' の 実行結果 ]
T-SQL: 誕生日から年齢を取得する 7

[ @ProcessDate = '2017-02-28' の 実行結果 ]
T-SQL: 誕生日から年齢を取得する 5

[ @ProcessDate = '2017-03-01' の 実行結果 ]
T-SQL: 誕生日から年齢を取得する 6

誕生日が 1992-02-29 の人は 2016-02-28 で 年齢が 25 才になっていますね!

© 2010-2024 SQL Server 入門