Berechnung der deutschen Kalenderwoche in SQL

Die datepart-Funktion des SQL-Servers liefert eine Woche zurück, wenn man wk als Parameter wählt. Dies ist allerdings nicht die Kalenderwoche. Die deutsche Kalenderwoche funktioniert nämlich so, dass die erste Woche des Jahres mit mindestens 4 Tagen in diesem Jahr die KW 1 dieses Jahres ist. Somit kann der 1.1. eines Jahres noch in der letzten KW des letzten Jahres liegen (nicht so im neuen Jahr 2009 – aber bis 2010 wollte ich nicht mit diesem Blog-Eintrag warten 🙂 )

Offensichtlich hängt die Berechnung davon ab, mit welchem Wochentag die Woche beginnt – bei uns in Deutschland mit dem Montag. Der SQL-Server verfügt über eine Einstellung @@DateFirst, die genau das angibt. Mit SET DATEFIRST 1 kann angegeben werden, dass der Monatg der 1. Tag der Woche ist. Diese Anweisung ist gültig für die Session.

In meinen hier beigefügten Skripten habe ich mich unabhängig von den Einstellungen mit DATEFIRST gemacht, so dass sie unabhängig von allen Einstellungen funktionieren und immer die deutsche Kalenderwoche zurückgeben:

select convert(nvarchar(10), getdate(), 104) Tag, dbo.getKW_Woche(getdate()) KW_Woche, dbo.getKW_Jahr(getdate()) KW_Jahr

liefert als Ergebnis

Tag KW_Woche KW_Jahr
01.01.2009 1 2009

Das bedeutet, dass der heutige Tag in der KW 1/2009 liegt, wie übrigens der 31.12.2008 auch.

In diesem Sinne, ein gutes, gesundes und erfolgreiches Neues Jahr

2 Gedanken zu „Berechnung der deutschen Kalenderwoche in SQL“

  1. Ich denke, die Kalenderwoche geht inzwischen kürzer:
    DECLARE @testDates TABLE (D DATE, Expected INT)
    INSERT @testDates VALUES (‚2021-01-11‘, 2)
    INSERT @testDates VALUES (‚2021-01-10‘, 1)
    INSERT @testDates VALUES (‚2021-01-04‘, 1)
    INSERT @testDates VALUES (‚2021-01-03‘, 53)
    INSERT @testDates VALUES (‚2020-12-28‘, 53)
    INSERT @testDates VALUES (‚2020-12-27‘, 52)

    SELECT D,
    Expected,
    DATEPART(ISO_WEEK, D) – DATEPART(ISO_WEEK, DATEADD(DAY, 4, DATEADD(YEAR, DATEDIFF(YEAR, 0, D), 0))) + 1
    FROM @testDates

  2. Hallo Andreas,
    ja inzwischen geht es einfacher. Du kannst einfach Datepart(ISO_Week, ) verwenden.
    Was Du danach geschrieben hast (– DATEPART(ISO_WEEK, DATEADD(DAY, 4, DATEADD(YEAR, DATEDIFF(YEAR, 0, D), 0))) + 1) ist verkehrt. Der nächste Tag, an dem das zum Tragen kommt, ist der 1.1.2026. (Davor ist das immer 0 und ändert somit nicht das Ergebnis)
    Dort sollte die Woche 1 rauskommen, was bei Datepart(ISO_Week, ‚2026-01-01‘) auch rauskommt. Dein Konstrukt liefert aber 0.

    Dabei ist Datepart(ISO_Week, ‚2026-01-01‘) auch unabhängig von den Einstellungen des SQL-Servers (DATEFIRST, LANGUAGE)

    Obiger Post stammt ja noch aus dem Jahr 2009.
    Ich habe einen neuen Post geschrieben, in dem ich mehr zu Datumsattributen im Allgmeinen dokumentiert habe: https://www.csopro.de/biblog/2020/10/datumsdimension-in-ssas-ab-2016-azure/

Schreibe einen Kommentar zu Andreas Antworten abbrechen

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