首页 > 解决方案 > Oracle查询获取2个日期之间的工作日数,不包括节假日

问题描述

我们正在使用 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,例如:2018 年 12 月 25 日、2018 年 12 月 31 日等。

HolidayDates
12/25/2018
12/31/2018 

因此,如果

日期 1 = 19 年 1 月 2 日(星期三)

日期 2 = 2018 年 12 月 27 日(星期四)

Date1 和 Date2 之间的工作日数为 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;

谢谢你。

标签: sqloracledateoracle11g

解决方案


获取上一个答案中的代码并将其从函数转换为查询给出:

甲骨文设置

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
:--------- | :-------- | ------------:
18 年 12 月 21 日 | 18 年 12 月 26 日 | 3
18 年 12 月 28 日 | 19 年 1 月 1 日 | 2
19 年 1 月 1 日 | 2019 年 1 月 7 日 | 5

db<>在这里摆弄


推荐阅读