mySQL WEEK() – ein Spezialist für Spezialfälle

Update: Dominik hat mich in den Kommentaren darauf aufmerksam gemacht, dass man einerseits einen zweiten Parameter der Funktion WEEK mitgeben kann um die Kalenderwochen richtig zu berechnen und anderseits dass die Funktion YEARWEEK() die Lösung meines Problems ist.

Der Originalpost:

Diesen Eintrag schreibe ich eher als Erinnerung an mich selbst, aber vielleicht hilft es ja einem anderen Menschen da draussen auch und dann hat es sich schon gelohnt…

Im Sommer 2010 habe ich in verschiedenen Projekten viel mit mySQL Datumsfunktionen umgesetzt und dort häufig mit Daten und Datenvergleichen gearbeitet.

Wie gesagt, es war Sommer und schnell griff ich zur „WEEK()“ Funktion und verglich dort z.B.

WEEK(`start`) <= WEEK(NOW())...

Es wurde Herbst, es wurde Winter… und dann war auf einmal 2011 und irgendwie kamen unerwartete Ergebnisse zu Tage.

Natürlich sollte einem Entwickler immer, immer, immer bewusst sein, dass es in jedem Jahr eine Kalenderwoche (0,)1,2,3,4,5,…,52 gibt, aber geblendet von der Sommersonne oder kosmischer Strahlung muss ich das wohl übersehen haben…

Nun aber zur Lösung der Probleme:

Bei einem Projekt war es nötig sich im „Wochenkontext“ zu bewegen und dort habe ich den “

WEEK(`start`)

“ Aufruf mit “

DATE_FORMAT(`start`, '%x%v')

“ (Also ein Datum Format: <jahr><kw>) ersetzt.
In einem anderen Projekt habe ich den “

WEEK(`start`) <= WEEK(NOW())

“ Vergleich mit “

TO_DAYS(`start`) <= TO_DAYS(NOW())

“ ersetzt – TO_DAYS() gibt die Anzahl der Tage seit dem Zeitstempel ‚0000-01-01‘ (=1) wieder.

Die Kalenderwochen Problematik tritt natürlich in jeder Programmiersprache auf, aber da ich – wenn möglich und die Daten in mySQL liegen – Datumsverlgeiche in mySQL abhandel – grade wegen der vielfältigen Datumsfunktionen – habe ich dieses Posting nur auf mySQL bezogen.

Es kann natürlich auch Situationen geben wo der Einsatz der WEEK() Funktion völlig gerechtfertigt ist.

2 Gedanken zu „mySQL WEEK() – ein Spezialist für Spezialfälle“

  1. Um die Kalenderwoche für Deutschland (ISO 8601-Standard) korrekt zu berechnen, muss man die Option 3 für die Funktionen WEEK und YEARWEEK verwenden.

    mysql> SELECT WEEK(‚1998-12-31‘, 3);
    -> 53
    mysql> SELECT YEARWEEK(‚1998-12-31‘, 3);
    -> 199853

Schreibe einen Kommentar

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