簡體   English   中英

SQL Server:使用帶有ISOWK參數的DATEPART將周的第一天更改為星期日

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM