分別以電腦目前時間與某個特定的日期作為基準點,使用 DATEADD()、DATEEIFF() 與 DATEPART() 函數去找出特定日期該月的第一個星期一之日期。
廢話不多說,先看程式碼:
-- 自訂相關變數
DECLARE @myDate DATETIME,
@days int,
@firstSat DATETIME,
@weekDiff int
-- 指定特定的日期給 @myDate
SET @myDate = '20080919'
-- 計算天數
SELECT @days = DAY(@myDate)
-- 上面那段程式碼同等於下面這段
-- SELECT DATEPART(dd, @myDate)
-- 取得當月第 6 天的日期
SELECT @firstSat = DATEADD(dd, 6 - @days, @myDate)
-- 與 1900 年 1 月 1 日相距多少週
SELECT @weekDiff = DATEDIFF(wk, '', @firstSat)
-- 將 1900 年 1 月 1 日加上相距的週數就是我們要的結果
SELECT DATEADD(wk, @weekDiff, '') [特定日期該月的第一個星期一]
為了避免宣告過多的變數,下面精簡後的程式碼:
-- 自訂一個 DATETIME 型別的變數
DECLARE @myDate DATETIME
-- 指定特定的日期給 @myDate
SET @myDate = '20080919'
-- 使用一道程式碼來計算我們要的結果
SELECT DATEADD(wk, DATEDIFF(wk, '', DATEADD(dd, 6 - DAY(@myDate), @myDate)), '')
[特定日期該月的第一個星期一]
由於兩段程式碼執行的結果都相同,因此僅貼上一個執行結果:
請參考 2008 年 9 月的月曆,來比較上面的執行結果:
如果要找出其他第 n 個星期一的日期,只需要將所計算出來與 1900 年 1 月 1 日相距的週數再加上 n - 1 就可以了。例如要找出第 3 個星期一:
-- 自訂一個 DATETIME 型別的變數
DECLARE @myDate DATETIME
-- 指定特定的日期給 @myDate
SET @myDate = '20080919'
-- 找出某月第 3 個星期一的日期
SELECT DATEADD(wk, DATEDIFF(wk, '', DATEADD(dd, 6 - DAY(@myDate), @myDate)) + 2 , '')
[第 3 個星期一的日期]
執行結果: