2017-04-18 47 views
0

我不知道其他国家,但在南非,如果周日是公共假期,我们周一有公共假期。我需要编写一个Update语句,它会在x天后返回日期,如果日期是公共假期后的星期一,它应该增加一天。我简单的更新语句如下:周日公共假期

UPDATE tbl_ProjectTracker 
set Predicted_Date = DATEADD(DAY, 20, Actual_Eng_Start_date) 

我已经有一个参照表,但我不知道我是否应该确定在桌子上或UPDATE语句增加一天。 请协助

回答

1

你应该有一个PublicHoliday表 然后,你可以更新predicted_date这样

DECLARE @PublicHoliday AS TABLE 
(
    HolidayDate date 
) 

DECLARE @NumberDaysPredict int = 20 

UPDATE pt 
set pt.Predicted_Date = DATEADD(DAY, @NumberDaysPredict + hl.NumberHolidaysOnSunday, pt.Actual_Eng_Start_date) 
FROM tbl_ProjectTracker pt 
CROSS APPLY 
(
    SELECT Count(*) AS NumberHolidaysOnSunday 
    FROM @PublicHoliday ph 
    WHERE ph.HolidayDate BETWEEN pt.Actual_Eng_Start_date AND DATEADD(DAY, @NumberDaysPredict, Actual_Eng_Start_date) 
    AND Datepart(dw,ph.HolidayDate) = 1 -- Sunday 
) hl 
+0

我从一个日历表中得到的两个意见。第一个视图是WorkingDays,我过滤了公共假期,第二个视图是相反的,将其命名为Public_Weekends。我试图做的是查询必须从'tbl_ProjectTracker'查找日期,在WorkingDays视图中查找日期,并将x天添加到日期,并将日历中的新日期带入tbl_ProjectTracker表。如果还有其他方法,请提出建议。谢谢 –

+0

你可以'交叉申请'到工作日,并获得第n天'按工作日顺序' – TriV

+0

感谢您的反馈 –

1

一个简单的方法将是一个情况下构建的天数:

UPDATE tbl_ProjectTracker 
set Predicted_Date = DATEADD(
DAY, 
CASE WHEN Actual_Eng_Start_date IN 
    (select day from public_holidays where datepart(dw, day) = 1) THEN 21 ELSE 20 END, 
Actual_Eng_Start_date) 

不幸的是SQL Server的日期/时间功能弱,至少可以说。 DATEPART(dw, ...)的结果取决于设置(DATEFIRST),所以查询有点不可靠。运行时务必确保设置正确。已请求扩展DATEPART以接受DATEFIRST的可选参数,这样您就可以获得一致的查询,但Microsoft已将其关闭为“无法解析”(https://connect.microsoft.com/SQLServer/feedbackdetail/view/432303/datepart-dw-date-should-allow-optional-date-first-Parameter)。

相关问题