2013-05-10 165 views
2

一个日期给出例如(2013年5月11日即星期六)。我必须在此日期之前找到7个工作日(MON-FRI)。那是2013年5月3日即星期五。我知道如何找出两个日期的营业日。通过: -Oracle SQL中的日期之前

SELECT from_date- todate - ((
      TRUNC (NEXT_DAY (from_date, 'SAT') - NEXT_DAY (todate - 1, 'SAT'))/7) + (
      TRUNC (NEXT_DAY (from_date, 'SUN') - NEXT_DAY (todate - 1, 'SUN'))/7)) + 1 
FROM dual; 

但现在我只有一个给定的日期,必须找到这一天的前7天(按工作日!)

+1

请界定 “营业日”。谢谢。 – 2013-05-10 17:32:53

+1

营业日意味着周一至周五.........已编辑它 – 2013-05-10 17:35:15

+0

因此,周一出现的假期被认为是营业日。 – EvilTeach 2013-05-10 19:10:09

回答

1
SELECT * FROM 
(
    SELECT (trunc(SYSDATE)-2)      start_dt -- May 11 -- 
     , (trunc(SYSDATE)-2)-LEVEL    bus_days -- All bus days before May 11 -- 
     , to_char((trunc(SYSDATE)-2)-LEVEL, 'DY') wk_day 
    FROM DUAL 
    CONNECT BY LEVEL <= (trunc(SYSDATE)-2)-((trunc(SYSDATE)-2) - 7) -- May 11-7 days ago=May 4 
) 
WHERE wk_day NOT IN ('SAT', 'SUN') 
ORDER BY bus_days 
/

START_DT BUS_DAYS WK_DAY 
-------------------------------- 
5/11/2013 5/6/2013 MON 
5/11/2013 5/7/2013 TUE 
5/11/2013 5/8/2013 WED 
5/11/2013 5/9/2013 THU 
5/11/2013 5/10/2013 FRI 
2

替换sysdate你需要的任何日期。

02:35:58 [email protected]> ed 
Wrote file S:\spool\sandbox\BUFFER_SYSTEM_36.sql 

    1 select sysdate - 7 seven_days_ago, min(sysdate - level) seven_bdays_ago 
    2 from dual 
    3 where rownum <= 7 
    4  and to_char(sysdate - level, 'DY') not in ('SAT', 'SUN') 
    5* connect by level <= 11 
02:36:16 [email protected]>/

SEVEN_DAYS_AGO  SEVEN_BDAYS_AGO 
------------------- ------------------- 
04.05.2013 02:36:17 02.05.2013 02:36:17 

Elapsed: 00:00:00.03 
+1

你不能'按级别连接< = 9'?它删除了很多不必要的递归查询... – Ben 2013-05-10 21:25:23

+0

@Ben确实有道理。出于某种原因(可能暂时是凌晨2点),我最初认为rownum <= 7会在任何情况下优化它们,但是看执行计划统计现在证明我错了... – 2013-05-11 05:49:31

+0

什么是关卡?我正在使用PL/SQL,我不知道什么级别是为了?你能帮我吗 ? – 2013-05-11 06:26:17