Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Woche des Jahres für Wochen, die mit Samstag beginnen

Ich hatte ein ähnliches Problem:Ich musste Wochennummern basierend auf den folgenden Regeln berechnen:

  • Die Woche beginnt am Freitag
  • Die restlichen Tage eines Jahres (alle Tage nach dem letzten Freitag des Jahres, die keine Woche abschließen) sollten in der ersten Woche des nächsten Jahres gezählt werden.

Zum Beispiel:

  • 27.12.2012 (Donnerstag) sollte Woche 52 von 2012 sein
  • 28.12.2012 (Freitag) sollte Woche 1 von 2013 sein
  • Woche 1 2013 geht vom 28.12.2012 bis zum 01.03.2013

Ich habe diese Aussage gemacht, die sowohl das JAHR als auch die WOCHENNUMMER basierend auf diesen Regeln berechnet, die Sie leicht an Ihre Umstände anpassen können:

SELECT IF(ceil(( dayofyear(current_date) + dayofweek(date_format(current_date, '%Y-01-01'))+1 )/7) > 52, YEAR(current_date)+1, YEAR(current_date)), 
        IF(ceil(( dayofyear(current_date) + dayofweek(date_format(current_date, '%Y-01-01'))+1 )/7) > 52, 1, ceil(( dayofyear(current_date) + dayofweek(date_format(current_date, '%Y-01-01'))+1 )/7));

Der knifflige Teil ist nur dieser Ausdruck:

ceil(( dayofyear(current_date) + dayofweek(date_format(current_date, '%Y-01-01'))+1 )/7)

Der Rest (If-Klauseln) dient nur dazu, das Ergebnis des Ausdrucks anzupassen, um Jahr+1 und Woche =1 in Woche 53 zu machen.

Ich werde versuchen, den Ausdruck so gut wie möglich zu erklären. Der folgende Ausdruck gibt Ihnen die Wochennummer ganz einfach (der Tag des Jahres dividiert durch 7 Tage in einer Woche aufgerundet):

ceil(( dayofyear(current_date))/7)

Aber jetzt möchten Sie, dass es am Freitag (oder an jedem anderen Tag) beginnt. Dazu müssen Sie zum aktuellen Tag die Tage der ersten Woche addieren, die Teil des Vorjahres waren (es ist, als hätte Ihre aktuelle Woche tatsächlich ein paar Tage zuvor begonnen, da Ihre erste Woche Tage aus dem Vorjahr enthält). Dies Der Ausdruck berechnet diesen Offset basierend auf dem Wochentag am 1. Januar:

dayofweek(date_format(current_date, '%Y-01-01'))+OFFSET

Der Offset ist die Differenz zwischen 7 und der Wochentagsnummer, an der die Woche beginnen soll:

  • 0 für Samstag
  • 1 für Freitag
  • 2 für Donnerstag
  • 3 für Mittwoch...

Jetzt müssen Sie es nur noch zum vorherigen hinzufügen, was zu dem oben genannten Ausdruck führt, der die Wochennummern berechnet, die an einem beliebigen Wochentag beginnen und davon ausgehen, dass Woche 1 im Vorjahr beginnt:

ceil(( dayofyear(current_date) + dayofweek(date_format(current_date, '%Y-01-01'))+OFFSET )/7)

Dann habe ich einfach ein IF hinzugefügt, das Woche 53 in Woche 1 umwandelt, und ein weiteres, um 1 zum Jahr hinzuzufügen, wenn es Woche 53 ist.