-
select to_char(d,'yyyy-mm-dd'),to_char(d,'d') dayofweek,to_char(d,'WW') WW,to_char(d,'IW') IW from (
-
select to_date('20131229','yyyymmdd')+level-1 as d from dual connect by level<=10);
-
TO_CHAR(D, D WW IW
---------- - -- --
2013-12-29 1 52 52
2013-12-30 2 52 01
2013-12-31 3 53 01
2014-01-01 4 01 01
2014-01-02 5 01 01
2014-01-03 6 01 01
2014-01-04 7 01 01
2014-01-05 1 01 01
2014-01-06 2 01 02
2014-01-07 3 01 02
已选择10行。
对比日历,发现2013年12月30,31日的IW,均划分到了2014年的第一周
MONTH YWE MWEEK SUN MON TUE WED THU FRI SAT
------ --- ----- ----- ----- ----- ----- ----- ----- -----
12月 49 1 1 2 3 4 5 6 7
50 2 8 9 10 11 12 13 14
51 3 15 16 17 18 19 20 21
52 4 22 23 24 25 26 27 28
53 5 29 30 31
-
select case
-
when (yweek = min(yweek)over(partition by mon order by yweek)) then
-
mon_name
-
else
-
null
-
end as month,
-
yweek as yweek,
-
row_number() over(partition by mon order by yweek) as mweek,
-
sum(decode(wday, '1', mday, null)) as sun,
-
sum(decode(wday, '2', mday, null)) as mon,
-
sum(decode(wday, '3', mday, null)) as tue,
-
sum(decode(wday, '4', mday, null)) as wed,
-
sum(decode(wday, '5', mday, null)) as thu,
-
sum(decode(wday, '6', mday, null)) as fri,
-
sum(decode(wday, '7', mday, null)) as sat
-
from (select dayofyear as everyday,
-
to_char(dayofyear, 'mm') as mon,
-
to_char(dayofyear, 'Month') as mon_name,
-
to_char(dayofyear, 'w') as mweek,
-
max(decode(to_char(dayofyear,'d'),'1',to_char(dayofyear, 'iw')+1,to_char(dayofyear, 'iw'))) over(order by dayofyear) as yweek,
-
to_char(dayofyear, 'd') as wday,
-
to_char(dayofyear, 'dd') as mday
-
from (select to_date(&year || '0101', 'yyyymmdd') + level - 1 as dayofyear
-
from dual
-
connect by level <= to_char(to_date(&year || '1231', 'yyyymmdd'),'ddd')
-
)
-
)
-
group by mon, mon_name, yweek
-
/
解决IW边界问题:
max(decode(to_char(dayofyear,'d'),'1',to_char(dayofyear, 'iw')+1,to_char(dayofyear, 'iw'))) over(order by dayofyear) as yweek