计算截止日期并排除 working/business 天 SQL
Calculate due date and exclude working/business days SQL
我想计算截止日期。
如果开始日期是30/12/2020,我需要从开始日期开始计算20个工作日,并显示从开始日期开始的第20个工作日的日期。
例如,如果开始日期是 30/12/2020 必须给我 28/01/2021(不包括周六和周日,并找到从 30/12/2020 开始的第 20 个工作日)。
但我无法排除周末。
SELECT
DATEADD(DAY,20,CAST(CAST('2020-12-30' AS DATE) AS DATETIME))
-(CASE WHEN DATENAME(dw,'2020-12-30') = 'Sunday' THEN 1 ELSE 0 END)
-(CASE WHEN DATENAME(dw,'2020-12-30') = 'Saturday' THEN 1 ELSE 0 END) AS DueDate
谢谢
您最好的选择是构建一个日历 table,其中包含一个指示每一天是否为工作日的布尔标志。然后你会做这样的事情:
select dt
from calendar
where dt >= '20201231' and is_working_day = 1
order by dt
offset 19 rows fetch next 1 row only
您的问题的提问方式,但是,一个选项枚举子查询中的天数,直到达到工作日计数:
declare @dt date = '20201231';
declare @no_days int = 20;
with cte as (
select @dt as dt, @no_days as no_days
union all
select dateadd(day, 1, dt),
case when datename(weekday, dt) in ('Saturday', 'Sunday')
then no_days
else no_days - 1
end
from cte
where no_days > 1
)
select max(dt) as res from cte
如果不关心节假日,那么第20个工作日正好是28天后。所以你可以使用:
dateadd(day, 28, '2020-12-30')
注意:这假定开始日期是工作日。
我想计算截止日期。 如果开始日期是30/12/2020,我需要从开始日期开始计算20个工作日,并显示从开始日期开始的第20个工作日的日期。
例如,如果开始日期是 30/12/2020 必须给我 28/01/2021(不包括周六和周日,并找到从 30/12/2020 开始的第 20 个工作日)。
但我无法排除周末。
SELECT
DATEADD(DAY,20,CAST(CAST('2020-12-30' AS DATE) AS DATETIME))
-(CASE WHEN DATENAME(dw,'2020-12-30') = 'Sunday' THEN 1 ELSE 0 END)
-(CASE WHEN DATENAME(dw,'2020-12-30') = 'Saturday' THEN 1 ELSE 0 END) AS DueDate
谢谢
您最好的选择是构建一个日历 table,其中包含一个指示每一天是否为工作日的布尔标志。然后你会做这样的事情:
select dt
from calendar
where dt >= '20201231' and is_working_day = 1
order by dt
offset 19 rows fetch next 1 row only
您的问题的提问方式,但是,一个选项枚举子查询中的天数,直到达到工作日计数:
declare @dt date = '20201231';
declare @no_days int = 20;
with cte as (
select @dt as dt, @no_days as no_days
union all
select dateadd(day, 1, dt),
case when datename(weekday, dt) in ('Saturday', 'Sunday')
then no_days
else no_days - 1
end
from cte
where no_days > 1
)
select max(dt) as res from cte
如果不关心节假日,那么第20个工作日正好是28天后。所以你可以使用:
dateadd(day, 28, '2020-12-30')
注意:这假定开始日期是工作日。