Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Isoweek dans SQL Server 2005

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)