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

10-122 会計年度で何週目かを求める

SQLパズル

カレンダーテーブルの各日付に対する、
会計年度で何週目かを求めて出力する

出力結果
日          曜日  週目
----------  ----  ----
2009/03/27   金     52
2009/03/28   土     52
2009/03/29   日     53
2009/03/30   月     53
2009/03/31   火     53
2009/04/01   水      1
2009/04/02   木      1
2009/04/03   金      1
2009/04/04   土      1
2009/04/05   日      2
2009/04/06   月      2
2009/04/07   火      2
2009/04/08   水      2


SQL

--■■■dense_rank関数を使う方法■■■
select to_char(Val,'yyyy/mm/dd') as 日,
to_char(Val,'dy') as 曜日,
dense_rank() over(partition by trunc(add_months(Val,-3),'yyyy') order by trunc(Val,'d')) as 週目
from (select to_date('20060331','yyyymmdd') + RowNum as Val
        from all_catalog
       where RowNum <= 365*3+1);

--■■■日曜からの日数差を求める方法1■■■
select to_char(Val,'yyyy/mm/dd') as 日,
to_char(Val,'dy') as 曜日,
trunc((Val-next_day(to_date(to_char(add_months(Val,-3),'yyyy') || '0401','yyyymmdd')-7,'日'))/7)+1 as 週目
from (select to_date('20060331','yyyymmdd') + RowNum as Val
        from all_catalog
       where RowNum <= 365*3+1);

--■■■日曜からの日数差を求める方法2■■■
select to_char(Val,'yyyy/mm/dd') as 日,
to_char(Val,'dy') as 曜日,
trunc((Val-trunc(to_date(to_char(add_months(Val,-3),'yyyy') || '0401','yyyymmdd'),'d'))/7)+1 as 週目
from (select to_date('20060331','yyyymmdd') + RowNum as Val
        from all_catalog
       where RowNum <= 365*3+1);


解説

trunc関数で、その週の日曜日を求めてます