Der Tabellenserver von Oracle bietet eine integrierte Funktion TRUNC(timestamp,'DY')
. Diese Funktion konvertiert jeden Zeitstempel am vorherigen Sonntag in Mitternacht. Was ist der beste Weg, dies in MySQL zu tun?
Oracle bietet außerdem TRUNC(timestamp,'MM')
an, einen Zeitstempel am ersten Tag des Monats, in dem er auftritt, auf Mitternacht umzustellen. In MySQL ist dies unkompliziert:
TIMESTAMP(DATE_FORMAT(timestamp, '%Y-%m-01'))
Aber dieser DATE_FORMAT
Trick wird wochenlang nicht funktionieren. Ich bin mir der WEEK(timestamp)
Funktion bewusst , aber ich möchte wirklich keine Wochennummer innerhalb des Jahres. Dieses Zeug ist für mehrjährige Arbeit.
TRUNC(date, 'DY' )
bekommt Wochen mit einem Sonntagsstart.'W'
bekommt einen Montagstart, zumindest in meinem System.Antworten:
Sie können beide
YEAR(timestamp)
undWEEK(timestamp)
und beide dieser Ausdrücke in derSELECT
und derGROUP BY
Klausel verwenden.Nicht übermäßig elegant, aber funktional ...
Und natürlich können Sie diese beiden Datumsteile auch in einem einzigen Ausdruck kombinieren, z
Bearbeiten : Wie Martin betont, können Sie die
YEARWEEK(mysqldatefield)
Funktion auch verwenden , obwohl ihre Ausgabe nicht so augenfreundlich ist wie die längere Formel oben.Bearbeiten Sie 2 [3 1/2 Jahre später!]: Wenn
YEARWEEK(mysqldatefield)
das optionale zweite Argument (mode
) auf 0 oder 2 gesetzt ist, ist dies wahrscheinlich der beste Weg, um nach vollständigen Wochen zu aggregieren (dh auch nach Wochen, die sich über den 1. Januar erstrecken), wenn dies der Fall ist was ist erwünscht. DerYEAR() / WEEK()
ursprünglich in dieser Antwort vorgeschlagene Ansatz hat zur Folge, dass die aggregierten Daten für solche "überspannenden" Wochen in zwei geteilt werden: eine mit dem früheren Jahr, eine mit dem neuen Jahr.Ein sauberer Schnitt jedes Jahr auf Kosten von bis zu zwei Teilwochen, eine an jedem Ende, ist häufig in der Buchhaltung usw. erwünscht, und dafür ist der
YEAR() / WEEK()
Ansatz besser.quelle
YEARWEEK()
Ergebnisse in einem, vonINT(6)
dem ich glaube, dass es schneller zu sortieren / beizutreten / zu gruppieren sein wirdDie oben akzeptierte Antwort hat bei mir nicht funktioniert, da die Wochen in alphabetischer Reihenfolge und nicht in chronologischer Reihenfolge sortiert wurden:
Hier ist meine Lösung, um nach Wochen zu zählen und zu gruppieren:
Erzeugt:
quelle
ORDER BY date ASC
) sollte auch den Trick tunIch habe es herausgefunden ... es ist etwas umständlich, aber hier ist es.
Und wenn Ihre Geschäftsregeln besagen, dass Ihre Wochen montags beginnen, ändern Sie die
-1
in-2
.Bearbeiten
Jahre sind vergangen und ich bin endlich dazu gekommen, dies aufzuschreiben. http://www.plumislandmedia.net/mysql/sql-reporting-time-intervals/
quelle
Sie können die verkettete Jahres- und Wochennummer (200945) mit der Funktion YEARWEEK () abrufen . Wenn ich Ihr Ziel richtig verstehe, sollten Sie Ihre mehrjährigen Daten gruppieren können.
Wenn Sie den tatsächlichen Zeitstempel für den Wochenbeginn benötigen, ist es weniger schön:
Bei monatlichen Bestellungen können Sie die Funktion LAST_DAY () in Betracht ziehen. Die Sortierung erfolgt nach dem letzten Tag des Monats. Dies sollte jedoch der Sortierung nach dem ersten Tag des Monats entsprechen.
quelle
Fügen Sie dies einfach in die Auswahl ein:
Und
quelle
Wenn Sie das "Wochenenddatum" benötigen, funktioniert dies ebenfalls. Dies zählt die Anzahl der Datensätze für jede Woche. Beispiel: Wenn zwischen (einschließlich) 1/2/2010 und 1/8/2010 drei Arbeitsaufträge erstellt wurden und zwischen (einschließlich) 1/9/2010 und 1/16/2010 5 erstellt wurden, würde dies Folgendes zurückgeben:
3 08.01.2010
5 16.01.2010
Ich musste die zusätzliche Funktion DATE () verwenden, um mein Datum / Uhrzeit-Feld abzuschneiden.
quelle