Sie können sowohl YEAR(timestamp)
als auch WEEK(timestamp)
verwenden und beide Ausdrücke in der SELECT
- und GROUP BY
-Klausel verwenden.
Nicht übermäßig elegant, aber funktional...
Und natürlich können Sie diese beiden Datenteile auch in einem einzigen Ausdruck kombinieren, z. B. etwas wie
SELECT CONCAT(YEAR(timestamp), '/', WEEK(timestamp)), etc...
FROM ...
WHERE ..
GROUP BY CONCAT(YEAR(timestamp), '/', WEEK(timestamp))
Bearbeiten: Wie Martin hervorhebt, können Sie auch die YEARWEEK(mysqldatefield)
-Funktion verwenden, obwohl ihre Ausgabe nicht so benutzerfreundlich ist wie die längere Formel oben.
Bearbeiten 2 [3 1/2 Jahre später!]:
YEARWEEK(mysqldatefield)
mit dem optionalen zweiten Argument (mode
) auf 0 oder 2 eingestellt, ist wahrscheinlich der beste Weg, um nach vollständigen Wochen zu gruppieren (d. h. einschließlich Wochen, die über den 1. Januar hinausgehen), wenn dies gewünscht wird. Der Ansatz mit YEAR() / WEEK()
, der in dieser Antwort ursprünglich vorgeschlagen wurde, hat den Effekt, dass die aggregierten Daten für solche "überkreuzenden" Wochen in zwei Teile aufgeteilt werden: eine mit dem früheren Jahr, eine mit dem neuen Jahr.
Ein sauberer Schnitt jedes Jahr, mit bis zu zwei partiellen Wochen, eine an jedem Ende, wird oft in der Buchhaltung usw. bevorzugt, und dafür ist der Ansatz mit YEAR() / WEEK()
besser.
0 Stimmen
Sie meinen trunc(sysdate,'W'), nicht trunc(sysdate,'DY')
1 Stimmen
TRUNC(Datum, 'DY' )
gibt Wochen mit einem Sonntag-Start.'W'
startet zumindest in meinem System am Montag.