iT邦幫忙

DAY 6
7

T-SQL 應用之美系列 第 6

如何使用 T-SQL 找出特定日期該月的第一個星期一之日期

分別以電腦目前時間與某個特定的日期作為基準點,使用 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 個星期一的日期]

執行結果:


上一篇
透過 T-SQL 找出特定日期的上個月或前一年最後一天與倒數第 n 天之日期
下一篇
如何使用 T-SQL 計算年齡
系列文
T-SQL 應用之美30

尚未有邦友留言

立即登入留言