116 Stimmen

Wie gruppiere ich nach Woche in MySQL?

Oracles Tabellenserver bietet eine integrierte Funktion, TRUNC(timestamp,'DY'). Diese Funktion konvertiert jeden Zeitstempel auf Mitternacht des vorherigen Sonntags. Wie lässt sich das am besten in MySQL umsetzen?

Oracle bietet auch TRUNC(timestamp,'MM') an, um einen Zeitstempel auf Mitternacht des ersten Tages des Monats, in dem er liegt, umzurechnen. In MySQL ist dies einfach:

TIMESTAMP(DATE_FORMAT(timestamp, '%Y-%m-01'))

Aber dieser DATE_FORMAT Trick funktioniert nicht für Wochen. Ich kenne zwar die WEEK(timestamp) Funktion, aber ich möchte wirklich nicht die Wochennummer innerhalb des Jahres; das Ganze bezieht sich auf mehrjährige Arbeiten.

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.

3voto

Randy Punkte 1288

Wenn Sie das Datum des "Wochenendes" benötigen, funktioniert dies auch. Dabei wird die Anzahl der Datensätze für jede Woche gezählt. Beispiel: Wenn zwischen dem (einschließlich) 2. Januar 2010 und dem 8. Januar 2010 drei Arbeitsaufträge erstellt wurden und zwischen dem (einschließlich) 9. Januar 2010 und dem 16. Januar 2010 fünf erstellt wurden, wird Folgendes zurückgegeben:

3 1/8/2010
5 1/16/2010

Ich musste die zusätzliche DATE()-Funktion verwenden, um mein Datumszeitfeld zu kürzen.

SELECT COUNT(*), DATE_ADD( DATE(wo.date_created), INTERVAL (7 - DAYOFWEEK( wo.date_created )) DAY) week_ending
FROM work_order wo
GROUP BY week_ending;

3voto

Jon-Eric Punkte 16378

Vorheriger Sonntag:

STR_TO_DATE(CONCAT(YEARWEEK(timestamp,2),'0'),'%X%V%w')

Vorheriger Montag:

STR_TO_DATE(CONCAT(YEARWEEK(timestamp,3),'1'),'%x%v%w')

DATE_FORMAT(date,format) Referenz:

  • %V - Woche (01..53), wenn Sonntag der erste Tag der Woche ist; WEEK() Modus 2; verwendet mit %X
  • %v - Woche (01..53), wenn Montag der erste Tag der Woche ist; WEEK() Modus 3; verwendet mit %x
  • %w - Wochentag (0=Sonntag..6=Samstag)
  • %X - Jahr für die Woche, wenn Sonntag der erste Tag der Woche ist, numerisch, vier Ziffern; verwendet mit %V
  • %x - Jahr für die Woche, wenn Montag der erste Tag der Woche ist, numerisch, vier Ziffern; verwendet mit %v

1voto

Brian Powell Punkte 3168

Ich mag die week Funktion in MySQL, aber in meiner Situation wollte ich wissen, in welcher Woche des Monats sich eine Zeile befand. Ich habe diese Lösung genutzt:

wo run_date ein Zeitstempel wie 2021-02-25 00:00:00 ist

concat (
        date_format(run_date, '%Y-%m'),
        ' wk ',
        (week(run_date,1) - ( week(date_format(run_date, '%Y-%m-01')) - 1))
        ) as formatted_date

Dies gibt aus:

2021-02-23 --->    2021-02 wk 4
2021-02-25 --->    2021-02 wk 4
2021-02-11 --->    2021-02 wk 2
2021-03-02 --->    2021-03 wk 1

Die Idee dahinter ist, dass ich (mit relativer Sicherheit) wissen möchte, in welcher Woche des betreffenden Monats das Datum liegt.

Also verketten wir:

date_format(run_date, '%Y-%m') um 2021-02 zu erhalten

dann fügen wir den textlichen String wk hinzu

dann verwenden wir: week(run_date, 1) um die Woche (1 für den Start am Montag) dieses Datensatzes zu erhalten (was 7 wäre, weil der 21.02.2021 in der 7. Woche des Jahres liegt), und wir ziehen davon die Woche ab, in der der 1. Tag desselben Monats liegt - die week() für 2021-02-01 ist 5, weil sie in der 5. Woche des Jahres liegt:

(week(date_format(run_date, '%Y-%m-01'))

Leider beginnt die Zählung dabei bei 0, was den Leuten nicht gefällt, also ziehen wir 1 vom letzten Teil des Verkettungsergebnisses ab, damit die "Woche" bei 1 beginnt.

1voto

Dies könnte eine gute Option sein:

SELECT
 Jahr(datum_uhrzeit_feld) as jahr_datum, woche(datum_uhrzeit_feld) as woche_datum
VON
 bd.tabelle
GRUPPE VON
 jahr_datum, woche_datum;

Es würde so aussehen:

  • '2020', '14'
  • '2020', '15'
  • '2020', '16'
  • '2020', '17'
  • '2020', '18'

1 Stimmen

Testen Sie dies mit Daten, die von einem Jahr zum anderen reichen, bevor Sie es verwenden.

0 Stimmen

Ich habe es getestet, danke für die Information.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X