Oracle中给定时间段的开始日和结束日的周数列表

时间:2013-06-24 18:36:39

标签: sql oracle11g

我正在制作一份报告,需要每周提取数据,并在一段时间内每月分手。

以下是我的要求

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')

1 个答案:

答案 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;