Há um link aqui para outras tentativas anteriores http://www.sqlteam. com/forums/topic.asp?TOPIC_ID=60510
Este é o código ANTIGO para a função
CREATE function f_isoweek(@date datetime)
RETURNS INT
as
BEGIN
DECLARE @rv int
SELECT @rv = datediff(ww, dateadd(ww, datediff(d, 0, dateadd(yy, datediff(yy, 0, day4),3))/7,-4),day4)
FROM (SELECT dateadd(ww, datediff(day, 0, @date)/7, 3) day4) a
RETURN @rv
END
Depois de combinar a resposta brilhante de @AndriyM com a minha, chegamos a 1 linha. Este é o NOVO código.
CREATE function f_isoweek(@date datetime)
RETURNS INT
as
BEGIN
RETURN (datepart(DY, datediff(d, 0, @date) / 7 * 7 + 3)+6) / 7
-- replaced code for yet another improvement.
--RETURN (datepart(DY, dateadd(ww, datediff(d, 0, @date) / 7, 3))+6) / 7
END
Explicação para o código antigo (não vou explicar o novo código. São fragmentos do meu código e do código do AndriyM):
Encontrando o dia da semana 4 da data escolhida
dateadd(week, datediff(day, 0, @date)/7, 3)
Encontrando isoano - ano do dia da semana 4 de uma semana é sempre o mesmo ano que o isoano daquela semana
datediff(yy, 0, day4)
Ao adicionar 3 dias ao primeiro dia do isoano, um dia aleatório da primeira isosemana do isoano é encontrado
dateadd(yy, datediff(yy, 0, day4),3)
encontrar a semana relativa da primeira isosemana do isoano
datediff(d, 0, dateadd(yy, datediff(yy, 0, day4),3))/7
Encontrar a segunda-feira menos 4 dias da primeira isosemana resulta na quinta-feira da semana ANTES do primeiro dia da primeira isosemana do isoano
dateadd(ww, datediff(d, 0, dateadd(yy, datediff(yy, 0, day4),3))/7,-4)
Conhecendo a primeira quinta-feira da semana anterior à primeira isosemana e a primeira quinta-feira da semana escolhida, torna-se bastante fácil calcular a semana, não importa qual data de configuração tenha primeiro, pois os dias da semana de ambas as datas são quintas-feiras.
datediff(ww, dateadd(ww, datediff(d, 0, dateadd(yy, datediff(yy, 0, day4),3))/7,-4),day4)