Si vous n'avez pas de tableau de numéros, vous pouvez générer une liste de nombres séquentiels à la volée à l'aide de tables système:
par exemple
SELECT Number = ROW_NUMBER() OVER(ORDER BY object_id)
FROM sys.all_objects;
Si vous devez étendre cela pour plus de chiffres, vous pouvez traverser les tables:
SELECT Number = ROW_NUMBER() OVER(ORDER BY a.object_id)
FROM sys.all_objects a
CROSS JOIN sys.all_objects b;
Ensuite, il vous suffit d'ajouter / soustraire ce nombre de semaines à partir de votre date de début:
DECLARE @Monday DATE = DATEADD(WEEK, DATEDIFF(WEEK, 0, GETDATE()), 0);
WITH Numbers AS
( SELECT Number = ROW_NUMBER() OVER(ORDER BY object_id)
FROM sys.all_objects
)
SELECT WeekNumber = DATEPART(ISO_WEEK, w.DateMonday),
w.DateMonday
FROM ( SELECT DateMonday = DATEADD(WEEK, - n.Number, @Monday)
FROM Numbers n
) w;
C'est une façon verbale de le faire pour plus de clarté étape par étape, il peut être condensé à:
SELECT WeekNumber = DATEPART(ISO_WEEK, w.DateMonday),
w.DateMonday
FROM ( SELECT DateMonday = DATEADD(WEEK, DATEDIFF(WEEK, 0, GETDATE()) - ROW_NUMBER() OVER(ORDER BY object_id), 0)
FROM sys.all_objects
) w;
Aaron Bertrand a fait des comparaisons en profondeur des moyens de générer des listes séquentielles de nombres:
- Générer un ensemble ou une séquence sans boucles - partie 1
- Générer un ensemble ou une séquence sans boucles - partie 2
- Générer un ensemble ou une séquence sans boucles - partie 3
Bien sûr, la façon la plus simple de le faire serait de créer un table de calendrier