2017-04-18 67 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)。

相關問題