【发布时间】:2019-06-25 07:13:01
【问题描述】:
我们正在使用 SQL Server。
在我们的 CASE WHEN 语句中,我需要检查两个日期之间的天数是否大于 3 个工作日(因此不包括周末和节假日)。
CASE WHEN end_date - start_date > 3 THEN 0 --> this need to exclude
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 日等。
假日日期 2018 年 12 月 25 日 2018 年 12 月 31 日 所以,如果
日期 1 = 2019 年 1 月 2 日(星期三)
日期 2 = 2018 年 12 月 27 日(星期四)
Date1 和 Date2 之间的工作日数为 3 天(12/27、12/28 和 12/31)。
上面的查询会得到工作日的天数,包括周末和节假日。
如何在查询中排除周末和节假日?
谢谢。
已编辑答案:
select start_date, end_date,
datediff(day, mt.start_date, mt.end_date) datediff,
(select
(datediff(wk, mt.start_date, mt.end_date) )
+(case when datename(dw, mt.start_date) = 'sunday' then 1 else 0 end)
+(case when datename(dw, mt.end_date) = 'saturday' then 1 else 0 end)
) weekend,
(select count(*) from HolidayDates hd
where hd.holydayDate between mt.start_date and mt.end_date
) as [holydays (not weekends)],
datediff(day, mt.start_date, mt.end_date)
-(select
(datediff(wk, mt.start_date, mt.end_date) )
+(case when datename(dw, mt.start_date) = 'sunday' then 1 else 0 end)
+(case when datename(dw, mt.end_date) = 'saturday' then 1 else 0 end)
) * 2
-(select count(*) from HolidayDates hd
where hd.holydayDate between mt.start_date and mt.end_date
)
as diff
from MyTable mt
【问题讨论】:
-
您好,Oracle 语法与 SQL Server 不同,例如 SQL Server 没有 TRUNC(end_date, 'IW')
-
嗨,stackoverflow.com/questions/36021519/… 不计算两个日期之间的工作日数
-
您确实意识到在您的示例中,
Date1大于Date2并且不会返回任何内容。
标签: sql sql-server date sql-server-2012