Запрос Oracle для получения количества рабочих дней между 2 датами, исключая праздничные дни - PullRequest
0 голосов
/ 30 января 2019

Мы используем Oracle 11.

В нашем заявлении CASE WHEN мне нужно проверить, не превышает ли число дней между двумя датами> 3 рабочих дня (исключая выходные и праздничные дни).

    CASE WHEN end_date - start_date > 3  THEN 0  --> this includes weekend 
        and holidays
WHEN CODE = 1 THEN 1
WHEN CODE =2 THEN 2
ELSE 3
END AS MyColumn

Скажем, у меня есть таблица календаря праздников, в которой есть столбец HolidayDates, который содержит все праздники, например: 25/12/2018, 31/12/2018 и т. Д.

HolidayDates
12/25/2018
12/31/2018 

Итак, если

Дата1 = 1/2/19 (среда)

Дата2 = 27.12.18 (четверг)

Количество рабочих дней между датой 1 и датой 2составляет 3 дня (12/27, 12/28 и 12/31).

В приведенном ниже запросе будет указано количество рабочих дней, исключая выходные.

Как исключить праздничные дни в этомзапрос?

SELECT TO_CHAR( start_date, 'YYYY-MM-DD "("DY")"') AS start_date,

   ( TRUNC( end_date, 'IW' ) - TRUNC( start_date, 'IW' ) ) * 5 / 7
   + LEAST( TRUNC( end_date   ) - TRUNC( end_date,   'IW' ) + 1, 5 )
   - LEAST( TRUNC( start_date ) - TRUNC( start_date, 'IW' ), 5 )
     AS Num_Week_Days
FROM   table_name;

Спасибо.

1 Ответ

0 голосов
/ 30 января 2019

Взяв код из этого предыдущего ответа и преобразовав его из функции в запрос, вы получите:

Oracle Setup :

CREATE TABLE Holidays ( HolidayDates ) AS
SELECT DATE '2018-12-25' FROM DUAL UNION ALL
SELECT DATE '2018-12-31' FROM DUAL;

CREATE TABLE table_name ( start_date, end_date ) AS
SELECT DATE '2018-12-21', DATE '2018-12-26' FROM DUAL UNION ALL
SELECT DATE '2018-12-28', DATE '2019-01-01' FROM DUAL;

Запрос :

SELECT t.*,
       ( TRUNC( end_date, 'IW' ) - TRUNC( start_date, 'IW' ) ) * 5 / 7
       + LEAST( TRUNC( end_date   ) - TRUNC( end_date,   'IW' ) + 1, 5 )
       - LEAST( TRUNC( start_date ) - TRUNC( start_date, 'IW' ), 5 )
       - ( SELECT COUNT(1)
           FROM   holidays
           WHERE  HolidayDates BETWEEN t.start_date AND t.end_date
           -- Exclude any weekend holidays so we don't double count.
           AND    TRUNC( HolidayDates ) - TRUNC( HolidayDates, 'IW' ) <= 5
         )
       AS Num_Week_Days
FROM   table_name t;

Выход :

START_DATE | END_DATE  | NUM_WEEK_DAYS
:--------- | :-------- | ------------:
21-DEC-18  | 26-DEC-18 |             3
28-DEC-18  | 01-JAN-19 |             2
01-JAN-19  | 07-JAN-19 |             5

дБ <> скрипка здесь

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