计算截止日期并排除 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')

注意:这假定开始日期是工作日。