公众假期是星期天

时间:2017-04-18 08:07:04

标签: sql sql-server

我不了解其他国家,但在南非,如果星期天是公众假期,我们将在星期一享受公众假期。我需要编写一个Update语句,它将在x天后返回日期,如果日期是公共假日后的星期一它应该再添加一天。我的简单更新语句如下所示:

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

我已经有一个用于引用的表,但我不确定是否应该确定表或Update语句上的额外日期。 请协助

2 个答案:

答案 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)。

答案 1 :(得分:1)

你应该有一个PublicHoliday表 然后你可以像那样更新predict_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