2013-05-10 2 views
2

ОДНА Дата дается, например, (11 мая 2013 г. в субботу). Я должен найти 7 рабочих дней (MON-FRI) до этой даты. Это 3 МАЯ 2013 ГОДА. Я знаю, как узнать рабочие дни за две даты. по: -до даты в 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

Уточнитните "рабочий день". Благодарю. –

+1

Рабочие дни означают пн-пт ......... отредактировали его –

+0

Так праздники, появляющиеся в понедельник, считаются рабочими днями. – EvilTeach

ответ

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

+0

@Ben, что действительно имеет смысл. по какой-то причине (вероятно, время 2AM) я изначально думал, что rownum <= 7 оптимизирует их в любом случае, но просмотр статистики плана выполнения теперь оказался мне неправильным ... –

+0

Что такое уровень? Я использую PL/SQL, и я не знаю, на каком уровне? Вы можете помочь ? –

Смежные вопросы