Il y a un lien ici pour d'autres tentatives antérieures http://www.sqlteam. com/forums/topic.asp?TOPIC_ID=60510
Ceci est l'ANCIEN code de la fonction
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
Après avoir combiné la brillante réponse de @AndriyM avec la mienne, nous n'avons plus qu'une ligne. C'est le NOUVEAU code.
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
Explication pour l'ancien code (ne va pas expliquer le nouveau code. Il s'agit de fragments de mon code et du code d'AndriyM) :
Trouver le jour de la semaine 4 de la date choisie
dateadd(week, datediff(day, 0, @date)/7, 3)
Trouver l'isoannée - l'année du jour de la semaine 4 d'une semaine est toujours la même année que l'isoannée de cette semaine
datediff(yy, 0, day4)
Lors de l'ajout de 3 jours au premier jour de l'isoannée, un jour aléatoire de la première isosemaine de l'isoannée est trouvé
dateadd(yy, datediff(yy, 0, day4),3)
trouver la semaine relative de la première isoweek de l'isoyear
datediff(d, 0, dateadd(yy, datediff(yy, 0, day4),3))/7
Trouver le lundi moins 4 jours de la première iso-semaine donne le jeudi de la semaine AVANT le premier jour de la première iso-semaine de l'iso-année
dateadd(ww, datediff(d, 0, dateadd(yy, datediff(yy, 0, day4),3))/7,-4)
Connaître le premier jeudi de la semaine avant la première isoweek et le premier jeudi de la semaine choisie, il est assez facile de calculer la semaine, peu importe la date de réglage en premier puisque les jours de semaine des deux dates sont des jeudis.
datediff(ww, dateadd(ww, datediff(d, 0, dateadd(yy, datediff(yy, 0, day4),3))/7,-4),day4)