大哥、大姐们:
    请帮我看看,谢谢了,我就50分了,全给了。
    要求是查出第一段时间内(我的sql里4月1号到9月1号),间隔几周(我sql里是3周),某个星期几(代码里是1和4)的日期,我这个将查询时间段拉长,间隔时间改小,就算不出来了,请帮忙优化下,多谢。Select tdate, week
  From (Select to_char(c1, 'yyyymmdd') tdate,
               decode(to_char(c1, 'd'),
                      '1',
                      'seven',
                      '2',
                      'one',
                      '3',
                      'two',
                      '4',
                      'three',
                      '5',
                      'four',
                      '6',
                      'five',
                      '7',
                      'six') week
          From (
                --得出每个周日和往前推6天的日期
                Select Distinct c1 - Level + 1 c1
                  From (
                         --根据最小的日期一次往前推3周
                         Select c1 + (3 * 7) *
                                 (Level - 1) c1
                           From (
                                  --计算为周日的最小日期
                                  Select Min(c1) c1
                                    From (
                                           --构造4月1号到9月1号的日期表
                                           Select to_date('2013-04-01','yyyy-mm-dd') + Level - 1 c1
                                             From dual
                                           Connect By Level <=
                                                      to_date('2013-09-01','yyyy-mm-dd') - to_date('2013-04-01','yyyy-mm-dd') + 1)
                                   Where to_char(c1, 'd') = 1)
                         Connect By Level <=
                                    (to_date('2013-09-01','yyyy-mm-dd') - to_date('2013-04-01','yyyy-mm-dd')) /
                                    (3 * 7) + 1)
                Connect By Level < 8
                 Order By c1)
         Where c1 >= to_date('2013-04-01','yyyy-mm-dd'))q
 Where Exists (Select week
          From ( /**将某字段,由逗行分隔的值转成列**/
                Select REGEXP_SUBSTR('one,four', '[^,]+', 1, rownum) As week
                  From DUAL
                Connect By ROWNUM <= LENGTH('one,four') -
                           LENGTH(Replace('one,four', ',')) + 1) w
         Where w.week = q.week)

解决方案 »

  1.   

     Where Exists
     (Select week
              From ( /**将某字段,由逗行分隔的值转成列**/
                    Select REGEXP_SUBSTR('one,four', '[^,]+', 1, rownum) As week
                      From DUAL
                    Connect By ROWNUM <= LENGTH('one,four') -
                               LENGTH(Replace('one,four', ',')) + 1) w
             Where w.week = q.week)
    你上面这段话的作用  就 说明 是间隔 3周?
      

  2.   


    不是上面的3*7里面的3是间隔三周,这个'one,four'代表的是查星期一和星期四
      

  3.   

    需求:就是要查某段时间内间隔任意周次的任意星期几的日期。
    入参有四个,分别是开始日期,结束日期,间隔周次,要查询的星期几(这个参数暂时定为‘one,two...seven’样式)
      

  4.   

    你可以试下用Timespan 时间间隔类来做下,我实在是看不懂你上面的要求,不过是求间隔的这个类应该做的了!