iT邦幫忙

0

MS SQL取得Week方法比較(Datepart.Week vs Datepart.ISO_Week)

JT 2022-12-08 22:22:312620 瀏覽
  • 分享至 

  • xImage
  •  

MS SQL有兩個取得Week的方法

Microsoft的定義:

1.Week

Select DATEPART(WEEK,'2023/01/01') As'SQL-Week' --1

特性:

  • 預設開始的第一天為星期日,可由set datefirst 7調整
  • 每年的1/1為第一週

2.ISO_Week

Select DATEPART(ISO_WEEK,'2023/01/01') As'SQL-ISO_Week' --52

特性:

  • 預設開始的第一天為星期一,set datefirst 7調整無效
  • 每年的1/1為星期一、二、三、四,它就是第一週; 如果是星期五,則為去年的53週; 如果是星期六,則為去年的52週; 如果是星期日,則為去年的52週
  • 每一週都有七天

MS SQL測試程式碼:

--set datefirst 7; --預計是datefirst 7 => 就是星期日為第一天; 如果要調整的話,CASE WHEN也要相對應調整

DECLARE @StartDate DATE = '2003/12/25'
  , @EndDate DATE = '2025/03/01'

;WITH SeqDates AS (
        SELECT [Date] = @StartDate --如果要改為DateTime可以用 CONVERT(DATETIME,@StartDate)
        UNION ALL 
		SELECT [Date] = DATEADD(DAY, 1, [Date])
        FROM SeqDates WHERE [Date] < @EndDate
) 
SELECT [Date]
,CASE 
	WHEN DATEPART(WEEKDAY,[Date]) = 1 THEN N'星期日'
	WHEN DATEPART(WEEKDAY,[Date]) = 2 THEN N'星期一'
	WHEN DATEPART(WEEKDAY,[Date]) = 3 THEN N'星期二'
	WHEN DATEPART(WEEKDAY,[Date]) = 4 THEN N'星期三'
	WHEN DATEPART(WEEKDAY,[Date]) = 5 THEN N'星期四'
	WHEN DATEPART(WEEKDAY,[Date]) = 6 THEN N'星期五'
	WHEN DATEPART(WEEKDAY,[Date]) = 7 THEN N'星期六'
END As'WeekDay(TW)'
,DATEPART(WEEKDAY,[Date]) As'WeekDay'
,DATEPART(WEEK,[Date]) As'SQL-Week',DATEPART(ISO_WEEK,[Date]) As'SQL-ISO_Week'
FROM SeqDates
Where [Date] like '%-12-2[5-9]' or [Date] like '%-12-3[0-1]' or [Date] like '%-01-0[1-7]' --只取每年12/25~01/07來比較
OPTION (MAXRECURSION 0) --MAXRECURSION設為0時就是不限定遞迴次數; 但是要避免無窮迴圈

執行結果:

https://ithelp.ithome.com.tw/upload/images/20221208/20129970gKUqNHnv1D.jpg

如果要修改可以參考: https://ithelp.ithome.com.tw/questions/10208690?sc=rss.qu

結論:

最後還是要看使用者要接受哪一種週別的定義。

參考資料來源:
https://learn.microsoft.com/zh-tw/sql/t-sql/functions/datepart-transact-sql?view=sql-server-ver16
https://ithelp.ithome.com.tw/questions/10208690?sc=rss.qu
https://zh.wikipedia.org/wiki/ISO%E9%80%B1%E6%97%A5%E6%9B%86


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言