7 Stimmen

MySQL: Wochendatumsbereich von Wochennummer in einer Abfrage

Ich habe eine Datenbanktabelle, die in etwa wie folgt aussieht:

| id         | clock         | info
----------------------------------------------
| 1          | 1262556754    | some info
| 2          | 1262556230    | some other info
| 3          | 1262556988    | and another
| 4          | 1262555678    | and some more

Es enthält Protokollsätze und einen Unix-Zeitstempel, wann dieses Protokoll geschrieben wurde. Was ich brauche, ist ein wöchentlicher Bericht über die Anzahl der Protokolleinträge in jeder Woche. Hier ist eine Abfrage, die ich geschrieben habe:

SELECT
    DATE_FORMAT(FROM_UNIXTIME(clock), "%U") AS week
count(*) as cnt
FROM logs
WHERE DATE_FORMAT(FROM_UNIXTIME(clock), "%Y") = '2010'
GROUP BY week

Dies führt zu einem Ergebnis wie diesem:

| week       | cnt
-------------------------------
| 1           | 55 
| 2           | 134   
| 4           | 765
| 20          | 65

Großartig! Aber was ich gerne sehen würde, ist ein Datumsbereich wie 08 Feb 2010 00:00 - 15 Feb 2010 00:00 so dass meine Ergebnismenge wie folgt aussehen würde:

| day_start           | day_end           | cnt
---------------------------------------------------------
| 08 Feb 2010 00:00   | 15 Feb 2010 00:00 | 55 
| 15 Feb 2010 00:00   | 22 Feb 2010 00:00 | 76
| 22 Feb 2010 00:00   | 01 Mar 2010 00:00 | 756

Gibt es eine Möglichkeit, dies zu tun?

6voto

igelkott Punkte 1287

Verwenden Sie STR_TO_DATE('201008 Monday', '%X%V %W'); um ein richtiges Datum zu erhalten wie 2010-02-22 dann verwenden Sie DATE_FORMAT um das gewünschte Format zu erhalten.

3voto

João Pereira Punkte 3487

Wenn die Spalte "Woche" die Nummer einer bestimmten Woche innerhalb eines Jahres speichert, können Sie sie einfach mit der Funktion makedate in eine Datumszeichenfolge umwandeln.

z.B:

select makedate(2010, week * 7);

Das sollte funktionieren, da Ihre Berichte jahresspezifisch sind. Zum Wohl

0voto

Eaten by a Grue Punkte 18900

Ich würde einfach Ihre day_start und dann danach gruppieren.

Wenn Sie den Sonntag als ersten Tag der Woche betrachten, subtrahieren Sie DAYOFWEEK() - 1 um den letzten Sonntag zu erhalten. Fügen Sie dann 6 Tage hinzu, um den folgenden Samstag zu erhalten. Und das ist Ihr Datumsbereich:

SELECT
  DATE(FROM_UNIXTIME(clock) - INTERVAL DAYOFWEEK(FROM_UNIXTIME(clock)) - 1 DAY) AS day_start,
  (SELECT day_start) + INTERVAL 6 DAY AS day_end
  COUNT(*) as cnt
FROM logs
GROUP BY day_start

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