這就是我想出了感謝TetonSig和他提到的這個鏈接:http://www.sqlmag.com/article/tsql3/datetime-calculations-part-3
我們可以得到當前日期的前一週的週一獨家的日期( @AsOfDate)像這樣:
SELECT DATEADD(day, DATEDIFF(day,0, @AsOfDate-1) /7*7, 0);
這將獲得天數在1/1/1900和@AsOfDate之間的天數。/7 * 7將其轉換爲整週,然後將其添加回1/1/1900(星期一)以獲取@AsOfDate之前的星期一。 -1使其不包含@AsOfDate。沒有減1,如果@AsOfDate在星期一,它將被計爲「前一個」星期一。
接下來筆者表明,要獲得包容下週一,我們只需要添加7到以前的獨家配方星期一:
SELECT DATEADD(d, DATEDIFF(day,0, @AsOfDate-1) /7*7, 0)+7;
瞧!我們現在已經在@AsOfDate或之後獲得了第一個星期一。唯一的問題是,在我的情況下,上面的星期一(0)是一個移動的目標。我需要第一個[DayOfWeek]由班級日期決定,而不是第一個星期一。我需要換出ClassDayOfWeek計算上述0:
DATEADD(d, DATEDIFF(d, [ClassDayOfWeek], @AsOfDate-1)/7*7, [ClassDayOfWeek])+7
我想計算ClassDayOfWeek不依賴於或具有惹DATEFIRST設置@@。所以,我計算出它相對於基準日:
DATEDIFF(d, 0, StartDate)%7
這爲週一,6給出了0太陽,所以我們現在可以插在了[ClassDayOfWeek。我應該指出,這個0-6的值是以int表示的日期1/1/1900-1/7/1900。
DATEADD(d, DATEDIFF(d, DATEDIFF(d, 0, StartDate)%7, @AsOfDate-1)/7*7, DATEDIFF(d, 0, StartDate)%7)+7
而且在每個問題用途:
SELECT *
FROM tbl_Class cs
INNER JOIN tbl_Enrollment sce ON cs.pk_ClassID = sce.fk_ClassID
WHERE ...
AND sce.StartDate < DATEADD(d,
DATEDIFF(d,
DATEDIFF(d, 0, cs.StartDate)%7,
@AsOfDate-1)/7*7,
DATEDIFF(d, 0, cs.StartDate)%7)+7
'DATEPART(WEEKDAY' [取決於'@@ DATEFIRST'(http://stackoverflow.com/a/5984859/73226)再次 –
我的美國/英國爲中心的煩躁來襲!謝謝,馬丁。我會更新。 – TetonSig
我想指出同樣的事情。減2假設@@ datefirst設置爲7.有了這個前提我認爲這是有效的。在閱讀你提供的鏈接來理解你的文章,我想我找到了另一個解決方案,它消除了對@@ datefirst的依賴,並且不需要條件語句。非常感謝您的介紹和鏈接。使用哪一個可能歸結爲個人偏好。 – xr280xr