2013-05-10 166 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