過去在接觸 Oracle 相關課程中,學習了不少關於日期格式轉換、時間函式與設定方法。若久而久之沒有在工作上使用,常常不小心就忘記了,學習成效有限。在 SQL Server 方面也相同,若遇到問題解決的當下沒有記錄下來,時間一長也慢慢遺忘了。撰寫文章或部落格有個好處,就是當忘記的當下可以回去翻一翻自己的部落格,快速回憶當時的情境。也曾經有過 Google 尋找解答,找到自己的文章才赫然發現曾經解過這個問題(可能習慣使用的關鍵字關係),無形間著實幫了自己,非常有趣。
今天介紹的這篇也是工作上遇到的問題,雖然語法不困難,但透過鐵人賽讓自己加深印象。
當我們需要知道特定日期是星期幾時,我們能透過 DATENAME + WEEKDAY參數得知,DATENAME 語法使用方法如下:
DATENAME ( 時間單位, date )
如果我們今天的時間來說,想要知道今天星期幾…
SELECT DATENAME ( WEEKDAY,'2017-12-24 14:09:54.593')
另一個方法是透過 DATEPART,可以取得這個時間某個的時間單位
DATEPART( 時間單位, date )
但回傳的內容會為 1-7 表示周日-週六
SELECT DATEPART(DW, '2017-12-24 14:09:54.593')
取得當週/月/年第一天或最後一天
最近在處理資料逾時刪除的程序,常常遇到某些資料只保留到本週/月/年最後一天的規則。我們能透過 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'
若將時間單位 (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'
以此類推,若將 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'