SQL che elenca i record X con il numero di settimana e la data di lunedì per ogni settimana

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

  •  25-08-2022
  •  | 
  •  

Domanda

Sto cercando una query SQL che mi fornirebbe un elenco del numero di settimana e la data del lunedì per quella settimana particolare.

Per esempio:

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

I seguenti justs producono una settimana

select
     (DATEPART(ISO_WEEK,(CAST(getdate() as DATETIME)))) as WeekNumber,
     DATEADD(wk, DATEDIFF(d, 0, CAST(getdate() as DATETIME)) / 7, 0) AS DateMonday
È stato utile?

Soluzione

Se non si dispone di una tabella dei numeri puoi generare un elenco di numeri sequenziali al volo usando le tabelle di sistema:

per esempio

SELECT  Number = ROW_NUMBER() OVER(ORDER BY object_id)
FROM    sys.all_objects;

Se è necessario estenderlo per più numeri, puoi incrociare le tabelle:

SELECT  Number = ROW_NUMBER() OVER(ORDER BY a.object_id)
FROM    sys.all_objects a
        CROSS JOIN sys.all_objects b;

Quindi devi solo aggiungere/sottrarre questo numero di settimane dalla data di inizio:

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;

Questo è un modo verboso di farlo per la chiarezza passo passo, può essere condensato a:

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;

Esempio sul violino SQL

Aaron Bertrand ha fatto alcuni confronti di profondità modi per generare elenchi sequenziali di numeri:

Naturalmente il modo più semplice per farlo sarebbe quello di creare un Tabella del calendario

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top