【问题标题】:Oracle query to get the number of business days between 2 dates, excluding holidaysOracle查询获取2个日期之间的工作日数,不包括节假日
【发布时间】:2019-06-23 22:09:58
【问题描述】:

我们正在使用 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 = 2019 年 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;

谢谢。

【问题讨论】:

标签: sql oracle date oracle11g


【解决方案1】:

获取this previous answer 中的代码并将其从函数转换为查询给出:

Oracle 设置

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小提琴here

【讨论】:

    猜你喜欢
    • 2019-06-25
    • 1970-01-01
    • 2019-06-19
    • 1970-01-01
    • 2012-08-22
    • 2019-10-03
    • 1970-01-01
    • 2015-07-27
    • 2014-01-10
    相关资源
    最近更新 更多