[T-SQL] Numéro de la semaine ISO 8601

Hello la zone,

Je me retrouve coincé avec un problème super bête mais énervant : récupérer le numéro de la semaine d’après la date courante et récupérer la date du premier jour d’une semaine donnée depuis son numéro. Le soucis principal c’est que ça doit être ISO 8601-compliant et que, semble-t-il il n’existe pas, ni dans .Net ni dans T-SQL de SQL Server 2005 de méthode permettant de faire ça.

ISO 8601 définit que la première semaine de l’année est la première à contenir 4 jours (autrement dit, la première à contenir un jeudi) ce qui veut dire que les 1-3 janvier peuvent être sur l’année précédente, tout comme les 30-31 décembre peuvent appartenir à l’année suivante.

Bref, plein de monde en parle sur le net, tout le monde y va de son petit exemple de code, mais je n’ai rien trouvé de vraiment satisfaisant et qui me semble correct et efficace.

C’est pour ça que je me permet de faire appel à vous.

Est-ce que quelqu’un a une solution?

Merci d’avance!

J’ai un exemple long comme le bras fait de mes petites mains en T-SQL.

Résumé de l’algo:

[ol]
[li]Cas des dates dont les semaines sont potentiellement a cheval sur 2 années : quel est le 1er janvier à étudier pour les dates dont les semaines peuvent être 51,52,53 ou 01[/li][li] Si effectivement le mois est à cheval sur les 2 années est-ce la date l’est ? : C’est le cas pour les jours compris entre le 1er janvier +(- JOURSEM_1ERJANV+1) et le 1er janvier +(7 -JOURSEM_1ERJANV+0)[/li][li]La semaine 1 est la première semaine de 4 jours, sinon la semaine appartient à la dernière semaine de l’année précédente.[/li][li]Si la semaine appartient à la dernière semaine de l’année précédente: On regarde le lundide la semaine du 31 déc de l’année précédente au 1er janvier de l’année en question[/li][li]Si la semaine appartient à la première semaine de 4 jours de l’année alors: l’année de la Semaine c’est année+1 si on est en décembre: et année=année rentrée si on est en janvier.[/li][li]Si le jour du 1er janvier est > à jeudi alors la semaine commence au prochain lundi càd 1 janvier +(7- JOURSEM_1ERJANV+1)[/li][li]Si le jour du 1er janvier est <= à Jeudi alors la semaine commence +(7- JOURSEM_1ERJANV+1)[/li][/ol]

Attention c’est une formalisation rapide: du copier coller de commentaire de mon code.

edit: Et ensuite j’itère du 1er janvier au premier décembre sur cette fonction en insérant les données dans une table calendrier.

Bon, j’ai trouvé une méthode qui fait ça dans le sens date => week number dans un example perdu tout en bas d’une page de MSDN.

Je vous la copie-colle ici, pour ceux que ça intéresse.
[codebox]if exists (select * from dbo.sysobjects where name = ‹ FN_GET_ISO_WEEK › and type = ‹ FN ›)
drop function FN_GET_ISO_WEEK
go

create function FN_GET_ISO_WEEK (@DATE datetime)
returns int

as

begin
declare @ISOweek int
set @ISOweek = datepart(wk,@DATE)+1
- datepart(wk, cast(datepart(yy,@DATE) as char(4))+‹ 0104 ›)
–Special cases: Jan 1-3 may belong to the previous year
if (@ISOweek=0)
set @ISOweek = dbo.FN_GET_ISO_WEEK(cast(datepart(yy, @DATE) - 1
as char(4)) + ‹ 12 › + cast(24 + datepart(day, @DATE) as char(2)))+1
–Special case: Dec 29-31 may belong to the next year
if ((datepart(mm, @DATE) = 12) and
((datepart(dd, @DATE) - datepart(dw, @DATE)) >= 28))
set @ISOweek=1
return (@ISOweek)
end;

go[/codebox]

Maintenant il ne me reste plus qu’à faire l’inverse, récupérer la date du premier jour de la semaine depuis un numéro de semaine… Ca ne devrait plus trop être compliqué… (si qqn a quand même ça sous le coude, je suis preneur :slight_smile: )

MP vers à 9h37 : code T-SQL un peu brut de fonderie mais qui fonctionne