我不了解其他国家,但在南非,如果星期天是公众假期,我们将在星期一享受公众假期。我需要编写一个Update语句,它将在x天后返回日期,如果日期是公共假日后的星期一它应该再添加一天。我的简单更新语句如下所示:
UPDATE tbl_ProjectTracker
set Predicted_Date = DATEADD(DAY, 20, Actual_Eng_Start_date)
我已经有一个用于引用的表,但我不确定是否应该确定表或Update语句上的额外日期。 请协助
答案 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