SQL qui répertorie X enregistrements avec le Number Week et la date de lundi pour chaque semaine

StackOverflow https://stackoverflow.com/questions/20353802

  •  25-08-2022
  •  | 
  •  

Question

Je recherche une requête SQL qui me fournirait une liste du Number et la date du lundi pour cette semaine.

Par exemple:

WeekNumber  DateMonday
39          2013-09-23
40          2013-09-30
...         ...

Les Justs suivants produisent une semaine

select
     (DATEPART(ISO_WEEK,(CAST(getdate() as DATETIME)))) as WeekNumber,
     DATEADD(wk, DATEDIFF(d, 0, CAST(getdate() as DATETIME)) / 7, 0) AS DateMonday
Était-ce utile?

La solution

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;

Exemple sur le violon SQL

Aaron Bertrand a fait des comparaisons en profondeur des moyens de générer des listes séquentielles de nombres:

Bien sûr, la façon la plus simple de le faire serait de créer un table de calendrier

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top