【发布时间】:2019-05-05 12:34:06
【问题描述】:
我有一个日历表,其中包含几个字段,其中下面的字段很有用,我想在表中添加一个具有以下逻辑的新列“承诺日期”。我正在为此苦苦挣扎,需要帮助。
示例:开始日期 = '01-02-2019',然后添加两天。结果应该是一个工作日。
表名 := 日期表
开始日期,IsBillingday = 1(不包括节假日和周末),WeekdayFlag = 工作日,DayNameOfWeekShort = 'Mon'....Friday。
首先开始思考简单...
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 ...如果是..结束循环。 一个
【问题讨论】:
-
你说你有一个日历表,对吗?所以我假设该表说明了这一天是否是工作日;那么为什么不
LEAD到该行之后需要的工作日数呢? -
周四+4 和周五+3 应该总是带你到下周一。
-
更好的样本数据和逻辑会有所帮助。
-
星期四..我们应该只考虑 2 个工作日,然后我应该得到星期一。星期五……我们应该考虑 2 个工作日,然后我应该到星期二。
-
FullDate IsBillingDay Weekdayflag DayName PromiseDate Comment 1/01/2018 1 Weekday Tue 3/01/2018 Plus 2 days 2/01/2018 1 Weekday Wed 8/01/2018 3/01/2018 0 Weekday周四 8/01/2018 公共假期 4/01/2018 0 工作日 周五 8/01/2018 公共假期 5/01/2018 0 周末周六 N/A 6/01/2018 0 周末周日 N/A 7/01/2018 1 个工作日星期一 9/01/2018 8/01/2018 1 个工作日星期二 9/01/2018 1 个工作日星期三 10/01/2018 1 个工作日星期四
标签: sql sql-server