Si vous avez besoin d'extraire le numéro de semaine ISO d'une date dans SQL Server, vous pouvez utiliser le iso_week
argument lors de l'appel de DATEPART()
une fonction. Vous pouvez également utiliser le isowk
ou isoww
arguments pour faire la même chose.
Par "semaine ISO", je fais référence à la norme de date et d'heure ISO 8601.
Les semaines ISO commencent le lundi et la première semaine d'une année contient le 4 janvier de cette année. Par conséquent, il est possible que les dates de début janvier fassent partie de la 52e ou de la 53e semaine de l'année précédente, et que les dates de fin décembre fassent partie de la première semaine de l'année suivante.
Cela signifie que lorsque vous extrayez le numéro de semaine d'une date, vous pouvez obtenir des résultats différents selon que vous utilisez le calendrier grégorien ou la norme de date et d'heure ISO 8601.
Exemple
DECLARE @date date = '2021-01-01';
SELECT DATEPART(iso_week, @date);
Résultat :
53
Dans ce cas, la date est le 1er janvier 2021, mais en termes ISO, c'est la 53ème semaine de 2020.
Comparaison avec le grégorien
Voici un autre exemple pour le comparer à la semaine grégorienne.
DECLARE @date date = '2021-01-01';
SELECT
DATEPART(week, @date) AS week,
DATEPART(iso_week, @date) AS iso_week;
Résultat :
+--------+------------+ | week | iso_week | |--------+------------| | 1 | 53 | +--------+------------+
On voit donc qu'une même date peut avoir un numéro de semaine différent selon que l'on utilise le calendrier grégorien ou la norme ISO.
Nous pouvons faire la même chose avec une date proche de la fin de l'année précédente.
DECLARE @date date = '2020-12-27';
SELECT
DATEPART(week, @date) AS week,
DATEPART(iso_week, @date) AS iso_week;
Résultat :
+--------+------------+ | week | iso_week | |--------+------------| | 53 | 52 | +--------+------------+
Arguments alternatifs
Comme mentionné, peut également utiliser le isowk
ou isoww
pour renvoyer le numéro de semaine ISO.
DECLARE @date date = '2021-01-01';
SELECT
DATEPART(iso_week, @date) AS iso_week,
DATEPART(isowk, @date) AS isowk,
DATEPART(isoww, @date) AS isoww;
Résultat :
+------------+---------+---------+ | iso_week | isowk | isoww | |------------+---------+---------| | 53 | 53 | 53 | +------------+---------+---------+