2

给出了一个日期,例如(2013 年 5 月 11 日,即星期六)。我必须在此日期之前找到 7 个工作日(周一至周五)。那是 2013 年 5 月 3 日,即星期五。我知道如何找出两个日期之间的工作日。经过 :-

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 天(根据工作日!)

4

2 回答 2

2

替换sysdate为您需要的任何日期。

02:35:58 SYSTEM@sandbox> 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 SYSTEM@sandbox> /

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

Elapsed: 00:00:00.03
于 2013-05-10T18:36:47.173 回答
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
于 2013-05-13T14:40:08.013 回答