我正在制作一份报告,需要每周提取数据,并在一段时间内每月分手。
以下是我的要求
1)我需要从(1.1.2013)到(6.30.2013)开始的给定时期的每周数据,每月分手(1月,2月,3月等等)(我得到了一个解决方案这个..)
我期待低于输出。
Week1 01.01.2013 01.07.2013
Week2 01.08.2013 01.14.2013
Week3 01.15.2013 01.21.2013
Week4 01.22.2013 01.28.2013
Week5 01.29.2013 01.31.2013 (Week 5 is Partial week)
Week6 02.01.2013 02.07.2013 (First week of Month 2)
.....
2)这是我的关键要求, 有时我会在月中获得开始日期,比如说01.08.2013和结束日期06.30.2013。在这种情况下,月度休息将超过当月。类似的事情(2013年8月1日至2013年7月2日,2013年8月2日至2013年7月3日等)...... 所以我的输出应该是
Week1 01.08.2013 01.14.2013
Week2 01.15.2013 01.21.2013
Week3 01.22.2013 01.28.2013
Week4 01.29.2013 02.04.2013 (Week 4 goes to Feb Month)
Week5 02.05.2013 02.07.2013 (Month ends on Week 5 )
Week6 02.08.2013 02.14.2013 (1st week of Month 2)
Week7 02.15.2013 02.21.2013
.....
我在Oracle中寻找SQL查询。
非常感谢任何投入。
到目前为止,我得到了以下代码(我从Stackoverflow获得了这个代码)
select to_char(gen.d,'YYYY "cW"IW')
, min(gen.d)
, max(gen.d)
from (
select to_date('01.01.2013','DD.MM.YYYY') + level -1 d
from dual
connect by level <= 180 -- Instead of End date, I am passing no of days.
) gen
group by
to_char(gen.d,'YYYY "cW"IW')
, to_char(gen.d,'YYYY MM IW')
答案 0 :(得分:-1)
您可以尝试一下。我使用YYYYMMWW
格式来标识星期。
Select to_char(st_dt, 'YYYYMM') || '0' || ROW_NUMBER() OVER(PARTITION BY mon ORDER BY st_dt) week_key,
to_char(st_dt, 'MONTH'),
to_char(st_dt, 'YYYY'),
st_dt,
end_dt,
''
from (Select mon, week_num, min(t.dt) st_dt, max(t.dt) end_dt
from (Select dt,
to_char(dt, 'MM') mon,
'0' || to_char(dt, 'W') my_week,
to_char(dt, 'WW') Week_num
from (SELECT TRUNC(to_date('01-JAN-2020', 'DD-MON-YYYY') -
ROWNUM) dt
FROM DUAL
CONNECT BY ROWNUM < 366)) t
group by mon, week_num) m
order by st_dt;