SQL, in dem X -Aufzeichnungen mit der Woche und Montag für jede Woche aufgelistet sind

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

  •  25-08-2022
  •  | 
  •  

Frage

Ich suche nach einer SQL -Abfrage, die mir eine Liste der Weeknumber und des Montagdatums für diese bestimmte Woche zur Verfügung stellt.

Zum Beispiel:

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

Die folgenden Justs produzieren eine Woche

select
     (DATEPART(ISO_WEEK,(CAST(getdate() as DATETIME)))) as WeekNumber,
     DATEADD(wk, DATEDIFF(d, 0, CAST(getdate() as DATETIME)) / 7, 0) AS DateMonday
War es hilfreich?

Lösung

Wenn Sie keine Nummerntabelle haben, können Sie mit Systemtabellen eine Liste von sequentiellen Zahlen im laufenden Fliegen erstellen:

z.B

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

Wenn Sie dies für weitere Zahlen erweitern müssen, können Sie Join -Tabellen überschreiten:

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

Dann müssen Sie diese Anzahl von Wochen nur von Ihrem Startdatum hinzufügen/subtrahieren:

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;

Dies ist eine ausführliche Möglichkeit, dies für Schritt für Schritt zu tun. Die Klarheit kann er kondensiert werden:

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;

Beispiel auf SQL Fiddle

Aaron Bertrand hat einige ausführliche Vergleichsweisen durchgeführt, um sequentielle Listen von Zahlen zu generieren:

Natürlich wäre der einfachste Weg, dies zu tun, um a zu erstellen Kalendertisch

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top