sql - 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;
谢谢你。
解决方案
获取上一个答案中的代码并将其从函数转换为查询给出:
甲骨文设置:
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<>在这里摆弄
推荐阅读
- r - R闪亮:滑块输入与小时,反应和绘图之间的链接
- amazon-web-services - 在无服务器框架上请求模板作为单独的文件?
- puppeteer - 为什么 puppeteer 截图页面两次然后页面重新加载
- spring-cloud - 使用 consul 的 Spring 云配置服务器“Discovery Fisrt”
- python - 更快/更懒惰的方式在 python 中将 m*n 均匀随机分成 n 组(每个组有 m 个元素)
- html - 如何设置悬停效果(注意:只有方形边框在悬停时应该像钻石形状一样旋转,而不是图像)
- python - Python - TCP 数据格式
- laravel - 发送邮件时如何从源代码中清除 Laravel 中的队列
- java - 我安排了一个任务,该任务下载文件并将其解压缩到资源文件夹中。它正常工作,但如果我将它作为 JAR 文件运行它会失败
- r - SF:从 UTM 到纬度/经度