日期范围集

时间:2013-04-08 16:18:44

标签: sql oracle plsql oracle10g

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

第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日,我希望从名单中获得周一和周五。

如何获得所需的输出?

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

我对您在示例中提供的日期范围感到有些困惑,因为每个范围的开始日期是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

答案 2 :(得分: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