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

5-18 期間内の特定の曜日の数を取得

SQLパズル

2005年9月1日から、今日の日付までの日曜日の数、
2005年9月2日から、今日の日付までの日曜日の数、
2005年9月3日から、今日の日付までの日曜日の数、
2005年9月4日から、今日の日付までの日曜日の数、
2005年9月5日から、今日の日付までの日曜日の数、
2005年9月6日から、今日の日付までの日曜日の数、
2005年9月7日から、今日の日付までの日曜日の数、
2005年9月8日から、今日の日付までの日曜日の数、
2005年9月9日から、今日の日付までの日曜日の数、
2005年9月10日から、今日の日付までの日曜日の数、
2005年9月11日から、今日の日付までの日曜日の数、
2005年9月12日から、今日の日付までの日曜日の数、
を調べる。


SQL

select
(next_day(trunc(sysdate),'日')-7 -next_day(to_date('20050901','yyyymmdd')-1,'日'))/7+1 as "9月1日",
(next_day(trunc(sysdate),'日')-7 -next_day(to_date('20050902','yyyymmdd')-1,'日'))/7+1 as "9月2日",
(next_day(trunc(sysdate),'日')-7 -next_day(to_date('20050903','yyyymmdd')-1,'日'))/7+1 as "9月3日",
(next_day(trunc(sysdate),'日')-7 -next_day(to_date('20050904','yyyymmdd')-1,'日'))/7+1 as "9月4日",
(next_day(trunc(sysdate),'日')-7 -next_day(to_date('20050905','yyyymmdd')-1,'日'))/7+1 as "9月5日",
(next_day(trunc(sysdate),'日')-7 -next_day(to_date('20050906','yyyymmdd')-1,'日'))/7+1 as "9月6日",
(next_day(trunc(sysdate),'日')-7 -next_day(to_date('20050907','yyyymmdd')-1,'日'))/7+1 as "9月7日",
(next_day(trunc(sysdate),'日')-7 -next_day(to_date('20050908','yyyymmdd')-1,'日'))/7+1 as "9月8日",
(next_day(trunc(sysdate),'日')-7 -next_day(to_date('20050909','yyyymmdd')-1,'日'))/7+1 as "9月9日",
(next_day(trunc(sysdate),'日')-7 -next_day(to_date('20050910','yyyymmdd')-1,'日'))/7+1 as "9月10日",
(next_day(trunc(sysdate),'日')-7 -next_day(to_date('20050911','yyyymmdd')-1,'日'))/7+1 as "9月11日",
(next_day(trunc(sysdate),'日')-7 -next_day(to_date('20050912','yyyymmdd')-1,'日'))/7+1 as "9月12日"
from dual;


解説

next_day関数を使うと、
指定した日付より未来で、指定した曜日の日をDate型で取得できます。

next_day(trunc(sysdate),'日')-7が、sysdate以前で最小日付の日曜日
next_day(to_date('20050901','yyyymmdd')-1,'日')が、2005年9月1日以降で最小日付の日曜日
となります。

後は、植木算の考え方を使って、
(sysdate以前で最小日付の日曜日 - 2005年9月1日以降で最小日付の日曜日)/7+1
が期間内の日曜日の数となります。

便利コム!! 2005年カレンダー

植木算
「植木算」で何を学ぶのか?
植木算の公式