[英]Change Default first day of week for datepart in SQL Server 2008
[英]SQL Server: change first day of week to Sunday using DATEPART with ISOWK parameter
我需要獲得一些日期的周數 。 例如,對於2016年1月,它應該是這樣的:
[Week Number]
53 <--- for dates from Jan 1 to Jan 2
1 <--- for dates from Jan 3 to Jan 9
2 <--- for dates from Jan 10 to Jan 16
... <--- etc.
如你所見,周應該從星期日開始。 我用以下函數來設置開始日期:
SET DATEFIRST 7
而這一個得到周數:
DATEPART(ISOWK, SOME_DATE)
但我注意到,當使用ISOWK
時, DATEFIRST
不會影響結果 - 周總是從星期一開始。
那么,我做錯了什么? 謝謝!
UPD:
我做了一個功能,看起來效果很好:
CREATE FUNCTION [dbo].[GetWeekNumber]
(
@date as DATETIME,
@offset as INT
)
RETURNS NVARCHAR(100)
BEGIN
DECLARE @weekNumber as int
DECLARE @year as int
SET @date = DATEADD(MINUTE, @offset, @date)
SET @year = DATEPART(year, DATEADD(DAY, 1 - DATEPART(WEEKDAY, @date), CAST(@date AS DATE)))
IF @@DATEFIRST = 7
BEGIN
SET @date = DATEADD(day, 1, @date)
END
SET @weekNumber = DATEPART(ISO_WEEK, @date)
RETURN concat(@year, ', Week ', right('0' + convert(nvarchar, @weekNumber), 2))
END
您需要傳遞日期和時區偏移量(以分鍾為單位)。 並且在執行此功能之前SET DATEFIRST @startDay
(1 - 星期一,7 - 星期日)。 例:
DECLARE @date as DATETIME
SET @date = '2016-01-03 12:00'
SET DATEFIRST 1
SELECT dbo.GetWeekNumber(@date, 0) -- 2015, Week 53
SET DATEFIRST 7
SELECT dbo.GetWeekNumber(@date, 0) -- 2016, Week 01
這是設計的。 根據MSDN :
ISO 8601包括ISO周日期系統,一個數周的編號系統。 每周與周四發生的年份相關聯。 例如,2004年第1周(2004W01)從2003年12月29日星期一到2004年1月4日星期日。
所以ISOWK
總是基於星期四,並且不受DATEFIRST
影響。
要獲得所需的結果,只需使用WEEK
而不是ISOWK
。
更新:也來自MSDN:
任何一年的1月1日定義星期datepart的起始編號,例如:DATEPART(wk,'Jan 1,xxxx')= 1,其中xxxx是任何年份。
讓第1周成為1月3日至9日的唯一方法是使用數學。 從DATEPART(wk...)
值中減去1,如果結果為0,則將其設為53(或者在日期中使用DATEADD
減去一周)。 沒有更簡單的方法,因為按設計,任何一年的第一周將是包含1月1日的那一周。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.