【问题标题】:Date range sets日期范围集
【发布时间】:2013-04-10 16:05:19
【问题描述】:

我有一个问题,分为两部分

第 1 部分

如何获取以下以 sysdate 为当前周的记录集?

07-Apr-2013 - 13-Apr-2013
14-Apr-2013 - 20-Apr-2013
21-Apr-2013 - 27-Apr-2013
28-Apr-2013 - 04-May-2013

如果一周已过 2012 年 4 月 7 日至 2013 年 4 月 13 日,则接下来的四组。所以总是有 4 周。

第 2 部分

如果当前周在日期范围内,即 2012 年 4 月 7 日 - 2013 年 4 月 13 日,我想从列表中获取星期一和星期五。

如何获得所需的输出?

【问题讨论】:

    标签: sql oracle plsql oracle10g


    【解决方案1】:

    我对您在示例中提供的日期范围有点困惑,因为每个范围的开始日期是 2013 年的星期日,但您将 2012 年显示为年份。我会假设 2012 是一个错字。

    这能得到你想要的吗?

    select 
    case
        when trunc(sysdate) between start_date and end_date
        then to_char(start_date + 1, 'DD-MON-YYYY')
        else to_char(start_date, 'DD-MON-YYYY')
    end
    || ' - ' ||
    case
        when trunc(sysdate) between start_date and end_date
        then to_char(end_date - 1, 'DD-MON-YYYY')
        else to_char(end_date, 'DD-MON-YYYY')
    end date_range
    from
    (    
        select 
            next_day(trunc(sysdate - 7 + ((level - 1) * 7)), 'SUN') start_date,
            next_day(trunc(sysdate) + ((level - 1) * 7), 'SAT') end_date
        from dual
        connect by level < 5
    )
    

    如果您只想要 4 周,那么您可以这样做

    select 
        to_char(next_day(trunc(sysdate - 7 + ((level - 1) * 7)), 'SUN'), 'DD-MON-YYYY') 
        || ' - ' ||
        to_char(next_day(trunc(sysdate) + ((level - 1) * 7), 'SAT'), 'DD-MON-YYYY') date_range
    from dual
    connect by level < 5
    

    【讨论】:

    • jwhite9 2012 是错字,我已更正。我想从周日开始一周
    • 并且可以像07-Apr-2013 - 13-Apr-201314-Apr-2013 - 20-Apr-2013这样的条目作为一个条目
    • 星期确实从星期日开始,除了第一个从星期一开始。您说如果 sysdate 在您想要的星期一和星期五的日期范围内。我更新了我的帖子,向您展示如何获得您要求的格式。
    • 你是对的,我的错。我怎样才能在08-Apr-2013 - 13-Apr-2013 和第二行14-Apr-2013 - 20-Apr-2013 得到这个
    • 我创建了一个视图,然后将 start 和 end_day 结合起来得到08-Apr-2013 - 13-Apr-2013。非常感谢,不胜感激。
    【解决方案2】:

    第 1 部分(从本周开始 4 周)

    SELECT TO_CHAR(trunc(SYSDATE, 'DY')) || ' - ' || TO_CHAR(trunc(SYSDATE, 'DY')+ 6) from dual
    UNION
    SELECT TO_CHAR(trunc(SYSDATE, 'DY')+7) || ' - ' || TO_CHAR(trunc(SYSDATE, 'DY')+ 13) from dual
    UNION
    SELECT TO_CHAR(trunc(SYSDATE, 'DY')+14) || ' - ' || TO_CHAR(trunc(SYSDATE, 'DY')+ 20) from dual
    UNION
    SELECT TO_CHAR(trunc(SYSDATE, 'DY')+21) || ' - ' || TO_CHAR(trunc(SYSDATE, 'DY')+ 27) from dual
    ;
    

    第 2 部分当周的周一和周五:

    SELECT trunc(SYSDATE, 'DY')+1 "Monday", trunc(SYSDATE, 'DY')+5 "Friday"
    FROM dual;
    

    这里是SQL Fiddle

    【讨论】:

      【解决方案3】:
      select 
        max(trunc(sysdate) + level - 7) as sunday,
        max(trunc(sysdate) + level - 2) as friday,
        max(trunc(sysdate) + level - 1) as saturday
      from dual
      connect by level < 30
      group by to_char(sysdate + level, 'iw')
      having max(trunc(sysdate) + level - 1) <= sysdate + 27
      order by 1 
      

      fiddle

      【讨论】:

      • Egor,如何根据日期升序对其进行排序?即 2013 年 4 月 1 日应该是第一个。
      • @Polppan - 使用order by 1 asc
      • Egor 我试过了,sqlfiddle.com/#!4/d41d8/9591m 但是它没有得到正确的结果,是因为它被转换为char?
      • Egor,另一件事是周应该从当前 sysdate 开始,而不是从月初开始。
      猜你喜欢
      • 1970-01-01
      • 2014-01-07
      • 2011-03-29
      • 2017-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多