2014-11-14 6 views
0

Мне нужно рассчитать год, на который назначено время. Например, 29 декабря 2003 года был назначен на неделю один год 2004 года (это, по-моему, для Европы). Вы можете посмотреть на это с этим кодом:SQL Получите «год ISO» для ISO-недели

SELECT DATEPART(isowk, '20141229'); 

Но теперь мне нужен простой способ, чтобы получить год на этой неделе назначена. То, что я в настоящее время сделать это не так элегантна:

DECLARE @week int, @year int, @date char(8) 

--set @date = '20150101' 
set @date = '20141229' 


SET @week = cast(datepart(isowk, @date) as int) 

if @week = 1 
begin 
     if DATEPART(MONTH, @date) = 12 
     begin 
      set @year = DATEPART(year, @date) + 1 
     end 
     else 
     begin 
      set @year = DATEPART(year, @date) 
     end 
end 

select @date "DATE", @week "WEEK", @year "YEAR" 

Если кто-нибудь знает более элегантный способ, это было бы неплохо :-)

+1

Не забудьте добавить тег вашей конкретной РСУБД, чтобы привлечь нужных людей к вашему вопросу. – nop77svk

+0

Вам также нужно обработать случай, когда неделя 52 тянется в январе (в этом случае ваш недельный год меньше, чем в текущем году). См. Мой ответ ниже. – Dan

ответ

3

Это решение не возвращает правильное значение для даты '1-1-2027'.

Следующее вернет правильное значение со всеми проверенными временем датами (и я проверил немало).

SELECT YEAR(DATEADD(day, 26 - DATEPART(isoww, '2012-01-01'), '2012-01-01')) 

Как взяты из: https://capens.net/content/sql-year-iso-week

+0

Nilla nilla, пожалуйста, не редактируйте сообщение, используя вторую учетную запись. –

1

Это самое компактное решение, которое я мог придумать:

CASE 
    WHEN DATEPART(ISO_WEEK, @Date) > 50 AND MONTH(@Date) = 1 THEN YEAR(@Date) - 1 
    WHEN DATEPART(ISO_WEEK, @Date) = 1 AND MONTH(@Date) = 12 THEN YEAR(@Date) + 1 
    ELSE YEAR(@Date) END 

Может использоваться непосредственно внутри оператора SELECT. Или вы можете подумать о создании пользовательской функции, которая принимает параметр @Date в качестве входных данных и выводит результат оператора case.

+1

Это можно немного сократить, взяв бит 'YEAR (@Date)' за пределами выражения CASE: 'CASE WHEN ... THEN -1 WHEN ... THEN +1 ELSE 0 END + YEAR (@Date)' , –

0

Для IsoYear, получить четверг от IsoWeek, а затем получить год.

Смежные вопросы