Следующий рабочий день, который не праздник в sql - PullRequest
0 голосов
/ 09 июля 2019

У меня есть Holiday таблица, которая содержит все выходные.

Как я могу получить следующий рабочий день от указанной даты в одном запросе SQL и не использовать FOR Цикл, как показано ниже?

DECLARE
    givendate   DATE := TO_DATE('2019-07-01', 'YYYY-MM-DD');
    out         NUMBER := 1;  
BEGIN
  WHILE out != 0 LOOP
    SELECT
        COUNT(*)
    INTO out
    FROM
        holiday h
    WHERE
        trunc(h.holiday_date) = trunc(givendate);
    IF out != 0 THEN
        givendate := givendate + 1;
    END IF;
  END LOOP;
  DBMS_OUTPUT.put_line(givendate);
END;

Ответы [ 2 ]

2 голосов
/ 09 июля 2019
SELECT MIN(hd)
FROM (
    select TO_DATE('2019-07-01', 'YYYY-MM-DD') as hd from dual
    union 
    select trunc(h.holiday_date + 1)
        FROM
            holiday h
        WHERE
            trunc(h.holiday_date) >= TO_DATE('2019-07-01', 'YYYY-MM-DD')
            )  t left join holiday h2 on trunc(h2.holiday_date) = t.hd
WHERE h2.holiday_date IS NULL;
0 голосов
/ 09 июля 2019

Возможно, вы захотите использовать иерархический запрос:

 select  nvl(max(holiday_date)+1, trunc(sysdate))
   from  holiday
connect  by holiday_date = prior holiday_date + 1
  start  with holiday_date = trunc(sysdate) 

Работает так:

  • если sysdate является выходным днем, он создает цепочку непрерывных выходных, а затем возвращает max holiday_date + 1 в качестве следующей рабочей даты

  • если sysdate не является выходным, он возвращает sysdate (nvl() делает это, когда max возвращает ноль)

Так что просто замените trunc(sysdate) на указанную дату, и она должна работать так же, как ваш кусок кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...