Получить год и номер недели от даты в SQL Server

Я пытаюсь получить номер года и номер недели в формате yyyyww лайк 201901, 201905, 201911 и т.д., и я использую этот запрос, чтобы сделать это:

declare @BeginDate datetime

set @beginDate = '2019-02-07'

select  
     concat(datepart(year, @BeginDate), right('0' + convert(varchar, datepart(week, dateadd(day, -7 , @BeginDate))), 2)) 

Это работало нормально до 2018 декабря. Но когда я попробую это для даты 2019-01-07, он вернулся 201953 что не правильно. Но для всех других значений, таких как 2019-01-14 и т. Д., Он правильно выбирает номер недели.

Так, как я могу точно выбрать комбинацию номера годовой недели в течение всего года

4 ответа

Вы не рассматриваете определение "годовой недели":

Согласно Википедии:неделя первого года - это неделя, содержащая первый четверг года, либо неделя, содержащая 4 января, либо неделя, начинающаяся с 29 декабря по 4 января.

Так что, если год начинается с недели 52 или 53, это трейлинг предыдущей недели предыдущего года.

так что у тебя есть:

set dateformat ymd 
set datefirst 1
declare @data as datetime
declare @year as int

set @data = cast('2017-01-01' as datetime)
set @year = case when datepart(iso_week,@data) >= 52 and month(@data) = 1 
                      then year(@data)-1 
                 when datepart(iso_week,@data) = 1 and month(@data) = 12 
                      then year(@data)+1
                      else year(@data) end

select concat (@year, right('0'+cast(datepart(iso_week,@data) as varchar(6)),2))

Результатом этого является 201652

изменить: обновлено, чтобы иметь всегда двузначную неделю

Вы можете попробовать, используя следующий код

SELECT concat(year('2019-01-07'),Format(datepart(day, datediff(day, 0, '2019-01-07')/7 * 7)/7 + 1 , '00') )

выход

201902

или же

SELECT concat(year('2019-01-01'),Format(DATEPART( wk, '2019-01-01')  , '00') )

выход

201901

Обычно более простой способ вычисления стандартных частей даты - использование стандартных функций. Итак, я предлагаю использовать DATEPART в сочетании с RIGHT, чтобы убедиться, что у нас есть два символа, начинающиеся справа:

DECLARE @DT AS DATE = '2019-01-07'
SELECT  CONCAT(year(@DT),
        RIGHT('0'+CONVERT(VARCHAR(2), DATEPART(wk, @DT)), 2))

Ниже блок кода не является точным решением, но он определенно поможет вам..

SQL

DECLARE @Dt datetime

SELECT @Dt='02-21-2008'

SELECT DATEPART( wk, @Dt)
Другие вопросы по тегам