在SQL中添加两天,并且结果日期必须是一个工作日

时间:2019-05-05 12:34:07

标签: sql sql-server

我有一个日历表,其中有几个字段,下面的字段是有用的,我想在表中添加一个具有以下逻辑的新列“ Promise date”。我正在为此苦苦挣扎,需要帮助。

示例:开始日期= '01 -02-2019',然后再添加两天。结果应该是一个工作日。

表格名称:=日期表格

开始日期,IsBillingday = 1(不包括假日和周末),WeekdayFlag =工作日,DayNameOfWeekShort ='Mon'....星期五。

开始首先考虑简单...

CASE WHEN DayNameOfWeekShort = 'Mon' AND ISBillingDay = '1' THEN CONVERT (nvarchar(10) , DATEADD(Day , 2 , dbo.DateTable.StartDate) , 23) 
WHEN DayNameOfWeekShort = 'Tue' AND ISBillingDay = '1' THEN CONVERT (nvarchar(10) , DATEADD(Day , 2 , dbo.DateTable.StartDate) , 23) 
WHEN DayNameOfWeekShort = 'Wed' AND ISBillingDay = '1' THEN CONVERT (nvarchar(10) , DATEADD(Day , 2 , dbo.DateTable.StartDate) , 23) 
WHEN DayNameOfWeekShort = 'Thu' AND ISBillingDay = '1' THEN CONVERT (nvarchar(10) , DATEADD(Day , 4 , dbo.DateTable.StartDate) , 23) 
WHEN DayNameOfWeekShort = 'Fri' AND ISBillingDay = '1' THEN CONVERT (nvarchar(10) , DATEADD(Day , 5 , dbo.DateTable.StartDate) , 23) ELSE '' END

但是然后在某些情况下,结果不是一个工作日...如何转到下一个工作日?

为此行

CASE WHEN DayNameOfWeekShort = 'Mon' AND ISBillingDay = '1' THEN CONVERT (nvarchar(10) , DATEADD(Day , 2 , dbo.DateTable.StartDate) , 23)

结果不是一个工作日...然后需要加+1天并检查是否有一个工作日...如果不加+1 ...如果是..end循环。 一个

1 个答案:

答案 0 :(得分:1)

如果要在未来至少两天下一个工作日,则可以使用窗口功能。我认为您有一个标记来标识工作日。

逻辑如下:

select c.*,
       min(case when c.isworkingday = 1 then c.date end) over
           (order by c.date
            rows between 2 following and unbounded following)
           ) as next_workingday_plus_2
from calendar c;

请注意,您应该将日期存储为 dates ,而不是字符串,尤其是在日历表中(除非您有一列或多列具有特定格式的日期)。