计算到期日并排除工作/营业日SQL

计算到期日并排除工作/营业日SQL,sql,sql-server,Sql,Sql Server,我想计算一个到期日。 如果开始日期为2020年12月30日,我需要从开始日期算起20个工作日,并显示从开始日期算起的第20个工作日的日期 例如,如果开始日期为2020年12月30日,则必须给我2021年1月28日(不包括星期六和星期日,从2020年12月30日算起的第20个工作日) 但我不能排除周末 SELECT DATEADD(DAY,20,CAST(CAST('2020-12-30' AS DATE) AS DATETIME)) -(CASE WHEN DATENAME(dw,

我想计算一个到期日。 如果开始日期为2020年12月30日,我需要从开始日期算起20个工作日,并显示从开始日期算起的第20个工作日的日期

例如,如果开始日期为2020年12月30日,则必须给我2021年1月28日(不包括星期六和星期日,从2020年12月30日算起的第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 

谢谢

您最好的选择是构建一个日历表,带有一个布尔标志,指示每天是否为工作日。然后你会做一些类似的事情:

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')

注意:假设开始日期为工作日。

假期如何?是否只有星期六和星期天不包括在内?无论如何,最好的解决方案是有一个日期表(dimDate),并在其中包含您想要的该日期的所有属性。isWorkDay对你来说很合适。但其他常见的列有周、月、月、年、财政等。日历表的有趣用法。我建议使用row_number()解决方案。谢谢,如果@dt是表中包含的一系列日期,请选择dt=(从#loopCustActiondate中选择CustActionDate),我想为表中的每个日期计算20天。