Мне нужно получить номера недель для некоторого набора дат. Например, для января 2016 года это должно быть примерно так:
[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)
Но я заметил, что DATEFIRST
не влияет на результаты при использовании ISOWK
- неделя всегда начинается с понедельника.
Итак, что я делаю не так? Спасибо!
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