Получить год и номер недели от даты в 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)