Получить год и номер недели от даты в SQL Server - PullRequest
0 голосов
/ 18 января 2019

Я пытаюсь получить номер года и номер недели в формате 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 ]

0 голосов
/ 18 января 2019

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

Согласно Википедии: Неделя первого года - это неделя, содержащая первый четверг года, или неделя, содержащая 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

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

0 голосов
/ 18 января 2019

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

SQL

DECLARE @Dt datetime

SELECT @Dt='02-21-2008'

SELECT DATEPART( wk, @Dt)
0 голосов
/ 18 января 2019

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

DECLARE @DT AS DATE = '2019-01-07'
SELECT  CONCAT(year(@DT),
        RIGHT('0'+CONVERT(VARCHAR(2), DATEPART(wk, @DT)), 2))
0 голосов
/ 18 января 2019

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

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
...