iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 6
0
Data Technology

SQL Server 學習日誌系列 第 6

06. 應用:取得當週為星期幾、當週/月/年第一天與最後一天

前言

過去在接觸 Oracle 相關課程中,學習了不少關於日期格式轉換、時間函式與設定方法。若久而久之沒有在工作上使用,常常不小心就忘記了,學習成效有限。在 SQL Server 方面也相同,若遇到問題解決的當下沒有記錄下來,時間一長也慢慢遺忘了。撰寫文章或部落格有個好處,就是當忘記的當下可以回去翻一翻自己的部落格,快速回憶當時的情境。也曾經有過 Google 尋找解答,找到自己的文章才赫然發現曾經解過這個問題(可能習慣使用的關鍵字關係),無形間著實幫了自己,非常有趣。

今天介紹的這篇也是工作上遇到的問題,雖然語法不困難,但透過鐵人賽讓自己加深印象。


語法說明

當我們需要知道特定日期是星期幾時,我們能透過 DATENAME + WEEKDAY參數得知,DATENAME 語法使用方法如下:

DATENAME ( 時間單位, date )

如果我們今天的時間來說,想要知道今天星期幾…

SELECT DATENAME ( WEEKDAY,'2017-12-24 14:09:54.593')

https://d2mxuefqeaa7sj.cloudfront.net/s_8CAA7633B3334C2349E6C0539ECE9C73C0F44CFE1C144DCE09358C77D9059CB5_1514124732753_image.png

另一個方法是透過 DATEPART,可以取得這個時間某個的時間單位

DATEPART( 時間單位, date ) 

但回傳的內容會為 1-7 表示周日-週六

SELECT DATEPART(DW, '2017-12-24 14:09:54.593')

https://d2mxuefqeaa7sj.cloudfront.net/s_8CAA7633B3334C2349E6C0539ECE9C73C0F44CFE1C144DCE09358C77D9059CB5_1514125200855_image.png

取得當週/月/年第一天或最後一天
最近在處理資料逾時刪除的程序,常常遇到某些資料只保留到本週/月/年最後一天的規則。我們能透過 DATEADD 與 DATEDIFF 的交互使用,即可以取得日期區間,進行資料刪減。主要的原理在於比較從1900年到目前為此的週數,再往前推一週就是本周的星期一;不做增減就是下一個星期一。

下面的例子將取得本周的星期一與下周的星期一。

DECLARE @today DATETIMEOFFSET = SYSDATETIMEOFFSET()
DECLARE @thisMonday DATETIMEOFFSET = DATEADD(ww, DATEDIFF(ww, 0, @today ) -1, 0)
DECLARE @nextMonday DATETIMEOFFSET = DATEADD(ww, DATEDIFF(ww, '', @today ) , '')

SELECT @today AS 'Today'
SELECT @thisMonday 'This Monday'
SELECT @nextMonday'Next Moday'

https://d2mxuefqeaa7sj.cloudfront.net/s_8CAA7633B3334C2349E6C0539ECE9C73C0F44CFE1C144DCE09358C77D9059CB5_1514127567216_image.png

若將時間單位 (ww, week) 改成 month,不做增加就是本月第一天;增加 1 個月就是下個月的第一天。

DECLARE @today DATETIMEOFFSET = SYSDATETIMEOFFSET()
DECLARE @thisMonthFirstDay DATETIMEOFFSET = DATEADD(month, DATEDIFF(month, 0, @today) , 0)
DECLARE @nextMonthFirstDay DATETIMEOFFSET = DATEADD(month, DATEDIFF(month, 0, @today) +1 , 0)

SELECT @today AS 'Today'
SELECT @thisMonthFirstDay 'This Month First Day'
SELECT @nextMonthFirstDay 'Next Month First Day'

https://d2mxuefqeaa7sj.cloudfront.net/s_8CAA7633B3334C2349E6C0539ECE9C73C0F44CFE1C144DCE09358C77D9059CB5_1514128058025_image.png

以此類推,若將 month → year ,不做增加就是今年第一天;增加 1 年就是明年的第一天。

DECLARE @today DATETIMEOFFSET = SYSDATETIMEOFFSET()
DECLARE @thisYearFirstDay DATETIMEOFFSET = DATEADD(year, DATEDIFF(year, 0, @today ) , 0)
DECLARE @nextYearFirstDay DATETIMEOFFSET = DATEADD(year, DATEDIFF(year, 0, @today ) +1 , 0)

SELECT @today AS 'Today'
SELECT @thisYearFirstDay 'This Year First Day'
SELECT @nextYearFirstDay 'Next Year First Day'

https://d2mxuefqeaa7sj.cloudfront.net/s_8CAA7633B3334C2349E6C0539ECE9C73C0F44CFE1C144DCE09358C77D9059CB5_1514128122809_image.png


上一篇
05.DATETIME、DATETIMEOFFSET、SYSDATETIMEOFFSET()、SWITCHOFFSET() 函式與應用
下一篇
13. Database Mail 設定
系列文
SQL Server 學習日誌30

尚未有邦友留言

立即登入留言