SQL: Ersten und letzten Tag der vorherigen Woche bestimmen

Datumsbezogene SQL-Abfragen sind äußerst hilfreich für das Erstellen von Auswertungen. Der Artikel zeigt eine Möglichkeit eine SQL-Abfrage auf die vergangene Woche zu beschränken. Unabhängig von der Spracheinstellung der Datenbank soll immer Montag der erste Tag der Woche und Sonntag der letzte Tag der Woche sein. Ein Jahreswechsel, bei dem ein Teil der Woche im alten und ein Teil der Woche im neuen Jahr liegt, stellt für das Beispiel-SQL auch kein Problem dar.

Grundidee

Um den ersten und letzten Tag der vergangenen Woche mit SQL zu ermitteln, kann vom aktuellen Tag aus auf den letzten Tag der vorherigen Woche geschlossen werden, indem die “Nummer das Tages in der Woche” abgezogen wird. Von diesem Tag nochmal sechs Tage in die Vergangenheit gerechnet, ergeben den ersten Tag der vorherigen Woche.

  • Heute zum Beispiel: 20210413 (Dienstag, KW 15)
  • Heute als Tag der Woche Montag=1, Dienstag=2, … , Sonntag=7
  • Letzter Tag der vorherigen Woche berechnet sich aus “Heute” – “Heute als Tag der Woche”. Zum Beispiel: 20210413 (Dienstag) – 2 = 20210411 (Sonntag)
  • Erster Tag der vorherigen Woche berechnet sich aus “Letzter Tag der vorherigen Woche” – 6. Zum Beispiel: 20210411 – 6 = 20210405 (Montag, KW 14)

SQL-Codebeispiel (Oracle)

Leider ist nicht überall auf der Welt Montag der erste Tag der Woche. Abhängig von der Einstellung des “National Language Support” (NLS) der Oracle Datenbank kann die Woche zum Beispiel am Montag oder Sonntag starten. Die SQL-Abfrage soll jedoch sicherstellen, dass der betrachtete Zeitraum immer Montag bis Sonntag einer Woche umfasst. Oracle stellt spezielle Datumsfunktionen zur Verfügung, die die Ausgabe nach ISO-Standard, unabhängig von den NLS-Einstellungen, ermöglichen. Leider bietet Oracle keine Funktion, die die Nummer das Tages in einer Woche ISO-konform ausgibt.

  • sysdate Aktuelles Datum. Ohne spezielle Formatierung ist die Anzeige abhängig von den NLS-Einstellungen.
  • to_char(sysdate, ‘YYYYMMDD’) Aktuelles Datum, formatiert: Jahr (vierstellig), Monat (zweistellig), Tag (zweistellig)
  • to_char(sysdate, ‘d’) Tag der Woche (1 .. 7), abhängig von den NLS-Einstellungen.
  • to_char(sysdate,’IW’) Nummer der aktuellen Woche im Jahr (1 .. 52/53), ISO-Standard
  • trunc(sysdate,’IW’) Datum des 1. Tag der atuellen Woche Woche, ISO-Standard, Montag
  • to_char(sysdate – to_number(trunc(sysdate) – trunc(sysdate,’IW’) + 1) -6, ‘yyyymmdd’) Erster Tag der vorherigen Wochen nach ISO-Standard, Montag
  • to_char(sysdate – to_number(trunc(sysdate) – trunc(sysdate,’IW’) + 1) , ‘yyyymmdd’) Letzter Tag der vorherigen Wochen nach ISO-Standard, Sonntag
SELECT
  to_char(sysdate - to_number(trunc(sysdate) - trunc(sysdate,'IW') + 1) -6, 'YYYYMMDD') first_day_of_last_week_iso
, to_char(sysdate - to_number(trunc(sysdate) - trunc(sysdate,'IW') + 1)   , 'YYYYMMDD')  last_day_of_last_week_iso
FROM dual;

weiterführende Links

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert