トップページに戻る    次のSQLパズルへ    前のSQLパズルへ

3-12 指定した年月時点での年齢を取得

SQLパズル

誕生日テーブルの誕生日を使って、
指定した年月時点での年齢を取得する


データ作成スクリプト

前のSQLパズルと同じ


SQL

col 年齢 for 99

--■■■case式を使う方法■■■
select 名前,誕生日,指定年月,
trunc(months_between(指定年月,
case when to_char(to_date(to_char(指定年月,'yyyy') || '1231'),'ddd') = '365'
      and to_char(誕生日,'mmdd') = '0229'
     then to_date(to_char(誕生日,'yyyy') || '0301','yyyymmdd')
     else 誕生日 end) /12) as 年齢
from 誕生日テーブル,
(select to_date('2004/02/27','yyyy/mm/dd') as 指定年月 from dual
union select to_date('2004/02/28','yyyy/mm/dd') from dual
union select to_date('2004/02/29','yyyy/mm/dd') from dual
union select to_date('2004/03/01','yyyy/mm/dd') from dual
union select to_date('2004/03/02','yyyy/mm/dd') from dual
union select to_date('2005/02/27','yyyy/mm/dd') from dual
union select to_date('2005/02/28','yyyy/mm/dd') from dual
union select to_date('2005/03/01','yyyy/mm/dd') from dual
union select to_date('2005/03/02','yyyy/mm/dd') from dual
union select to_date('2006/01/01','yyyy/mm/dd') from dual
union select to_date('2006/12/31','yyyy/mm/dd') from dual)
order by 名前,指定年月;

--■■■trunc関数を使う方法■■■
select 名前,誕生日,指定年月,
trunc((to_number(to_char(指定年月,'YYYYMMDD'))-to_number(to_char(誕生日,'YYYYMMDD')))/10000) as 年齢
from 誕生日テーブル,
(select to_date('2004/02/27','yyyy/mm/dd') as 指定年月 from dual
union select to_date('2004/02/28','yyyy/mm/dd') from dual
union select to_date('2004/02/29','yyyy/mm/dd') from dual
union select to_date('2004/03/01','yyyy/mm/dd') from dual
union select to_date('2004/03/02','yyyy/mm/dd') from dual
union select to_date('2005/02/27','yyyy/mm/dd') from dual
union select to_date('2005/02/28','yyyy/mm/dd') from dual
union select to_date('2005/03/01','yyyy/mm/dd') from dual
union select to_date('2005/03/02','yyyy/mm/dd') from dual
union select to_date('2006/01/01','yyyy/mm/dd') from dual
union select to_date('2006/12/31','yyyy/mm/dd') from dual)
order by 名前,指定年月;


解説

case式で、対象年月が閏年か平年かを調べて、分岐させてます。
trunc関数を使う方法もあります

別の方法(Laurent Schneiderさんのブログ)
2月29日の資料

生年月日から年齢を計算する簡単な計算式