2009年2月18日 星期三

如何使用 T-SQL 找出特定日期該週的星期一日期為何

先使用 getdate() 函數取得電腦目前的日期和時間,搭配 DATEADD() 與 DATEEIFF() 這兩個函數,並指定適當的日期計算單位,就可以推算出該週星期一的日期,此外,更進一步使用 CAST() 與 CONVERT() 函數轉換日期的格式,使其顯示不同精確度的結果:

-- 以電腦目前的日期和時間為基準點
SELECT getdate() AS 目前日期與時間

-- 精確到毫秒
SELECT DATEADD(week, DATEDIFF(week, '', getdate()), '') AS [本週星期一的日期(精確到毫秒)]

-- 使用 CAST 轉換日期輸出的格式
SELECT CAST(DATEADD(week, DATEDIFF(week, '', getdate()), '') AS VARCHAR(20)) AS [本週星期一的日期(僅到分)]

-- 使用 CONVERT 轉換日期輸出的格式
SELECT CONVERT(VARCHAR(20), DATEADD(week, DATEDIFF(week, '', getdate()), ''), 101) AS [本週星期一的日期(僅到日)]

下面的程式碼則是以 2000 年 2 月 12 日這個特定的日期為基準點,推算出當週星期一的日期,同樣的也使用 CAST() 與 CONVERT() 函數轉換日期的格式,使其顯示不同精確度的結果:

-- 以 2000 年 2 月 12 日為基準點
-- 精確到毫秒
SELECT DATEADD(week, DATEDIFF(week, '', '2000/2/12'), '') AS [2000年2月12日當週星期一的日期(精確到毫秒)]

-- 使用 CAST 轉換日期輸出的格式
SELECT CAST(DATEADD(week, DATEDIFF(week, '', '2000-02-12'), '') AS VARCHAR(20)) AS [2000年2月12日當週星期一的日期(僅到分)]

-- 使用 CONVERT 轉換日期輸出的格式
SELECT CONVERT(VARCHAR(20), DATEADD(week, DATEDIFF(week, '', '02-12-2000'), ''), 101) AS [2000年2月12日當週星期一的日期(僅到日)]

接下來,我們討論一下,如果要找出其他星期的話要怎麼辦?假設現在要找出當週星期五的日期:

-- 自訂一個 DATETIME 型別的變數
DECLARE @myDate as DATETIME
-- 找出2000年2月12日當週星期一的日期
SET @myDate = DATEADD(week, DATEDIFF(week, '', '2000/2/12'), '')
-- 星期一往後數的第 4 天是星期五
SELECT DATEADD(day, +4, @myDate) AS [2000年2月12日當週星期五的日期(精確到毫秒)]

這段程式碼是利用先前找出 2000 年 2 月 12 日當週星期一的日期,然後再以「天」為計算單位,往後加上 4 天,就可以找出當週星期五的日期了。所以我們可以舉一反三,找出其他星期的日期。

附註:
程式碼中的 week,代表的意思是以「週」為計算日期的單位,我們可以寫成 wk 或是 ww
至於 day 則是以「日」為計算日期的單位,可以寫成 dd 或是 d

最後是 我寫的抓取當週資料的語法
SELECT contact_id, contact_time, IPAddress, browser
FROM contactCount
WHERE (CONVERT(char(14), contact_time, 112) >= CONVERT(VARCHAR(20), DATEADD(week, DATEDIFF(week, '', GETDATE()), ''), 112))
AND CONVERT(char(14), contact_time, 112) <= (CONVERT(VARCHAR(20), DATEADD(week, DATEDIFF(week, '', GETDATE()) + 1, ''), 112) - 1)

抓取當週日期 第一天跟最後一天的語法
SELECT (CONVERT(VARCHAR(20), DATEADD(week, DATEDIFF(week, '', GETDATE()), ''), 112)) AS AA
,(CONVERT(VARCHAR(20), DATEADD(week, DATEDIFF(week, '', GETDATE()) + 1, ''), 112) - 1) AS BB
FROM contactCount

參考資料:http://msdn.microsoft.com/zh-tw/library/ms187928(SQL.90).aspx

沒有留言:

張貼留言