トップページに戻る
次の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年カレンダー