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

3-11 指定期間内に誕生日を迎える人を取得

SQLパズル

期間の開始日と、期間の終了日を指定して、
指定期間内に誕生日を迎える人を取得する。


データ作成スクリプト

create table 誕生日テーブル(
名前   char(4),
誕生日 date);

insert into 誕生日テーブル values('aaaa',to_date('2000/01/01','YYYY/MM/DD'));
insert into 誕生日テーブル values('bbbb',to_date('2000/02/27','YYYY/MM/DD'));
insert into 誕生日テーブル values('cccc',to_date('2000/02/28','YYYY/MM/DD'));
insert into 誕生日テーブル values('dddd',to_date('2000/02/29','YYYY/MM/DD'));
insert into 誕生日テーブル values('eeee',to_date('2000/03/01','YYYY/MM/DD'));
insert into 誕生日テーブル values('ffff',to_date('2000/03/02','YYYY/MM/DD'));
insert into 誕生日テーブル values('gggg',to_date('2000/11/01','YYYY/MM/DD'));
commit;


SQL

--■■■2004年10月1日から2005年1月3日に誕生日を迎える人■■■
select 名前,to_char(誕生日,'YYYY/MM/DD') as 誕生日
from 誕生日テーブル
where to_char(誕生日,'MMDD') between '1001' and '1231'
   or to_char(誕生日,'MMDD') between '0101' and '0103';

--■■■2004年2月26日から2004年3月2日に誕生日を迎える人■■■
select 名前,to_char(誕生日,'YYYY/MM/DD') as 誕生日
from 誕生日テーブル
where to_char(誕生日,'MMDD') between '0226' and '0302';

--■■■2004年3月1日から2004年3月2日に誕生日を迎える人■■■
select 名前,to_char(誕生日,'YYYY/MM/DD') as 誕生日
from 誕生日テーブル
where to_char(誕生日,'MMDD') between '0301' and '0302';

--■■■2005年2月27日から2005年2月28日に誕生日を迎える人■■■
select 名前,to_char(誕生日,'YYYY/MM/DD') as 誕生日
from 誕生日テーブル
where to_char(誕生日,'MMDD') between '0227' and '0228';

--■■■2005年3月1日から2005年3月2日に誕生日を迎える人■■■
select 名前,to_char(誕生日,'YYYY/MM/DD') as 誕生日
from 誕生日テーブル
where to_char(誕生日,'MMDD') between '0229' and '0302';


解説

to_charで月日を文字列で取得して、誕生日をbetweenでチェックしてます

要注意なのは、2月29日に生まれた人の誕生日が、
閏年は、2月29日で、
平年は、3月1日になることです。

■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
期間の開始日と、期間の終了日の年齢が異なるかを
調べたほうが分かりやすいでしょうね。

たとえば、2004年10月1日から2005年1月3日に誕生日を迎える人を調べるのは、
2004年10月1日の年齢と
2005年1月3日の年齢を比較するわけです。

select 名前,to_char(誕生日,'YYYY/MM/DD') as 誕生日
  from 誕生日テーブル
 where trunc((to_number(to_char(date '2004-10-01','yyyymmdd'))
             -to_number(to_char(誕生日,'YYYYMMDD')))/10000)
     !=trunc((to_number(to_char(date '2005-01-03','yyyymmdd'))
             -to_number(to_char(誕生日,'YYYYMMDD')))/10000);

2月29日の資料

2005年カレンダー