809 Stimmen

MySQL-Abfrage GROUP BY Tag / Monat / Jahr

Ist es möglich, eine einfache Abfrage zu erstellen, um zu zählen, wie viele Datensätze ich in einem bestimmten Zeitraum wie einem Jahr, einem Monat oder einem Tag habe, wobei eine TIMESTAMP Feld, wie:

SELECT COUNT(id)
FROM stats
WHERE record_date.YEAR = 2009
GROUP BY record_date.YEAR

Oder sogar:

SELECT COUNT(id)
FROM stats
GROUP BY record_date.YEAR, record_date.MONTH

Um eine monatliche Statistik zu haben.

Gracias.

27voto

Faisal Punkte 4304

Sie können dies einfach tun Mysql DATE_FORMAT() Funktion in GROUP BY. In manchen Fällen möchten Sie vielleicht eine zusätzliche Spalte hinzufügen, um die Übersichtlichkeit zu erhöhen, z. B. wenn sich die Datensätze über mehrere Jahre erstrecken und derselbe Monat in verschiedenen Jahren vorkommt, so dass Sie hier viele Optionen haben, um dies anzupassen. Bitte lesen Sie dies, bevor Sie beginnen. Ich hoffe, dass es sehr hilfreich für Sie sein wird. Hier ist eine Beispielabfrage für Ihr Verständnis

SELECT
    COUNT(id),
    DATE_FORMAT(record_date, '%Y-%m-%d') AS DAY,
    DATE_FORMAT(record_date, '%Y-%m') AS MONTH,
    DATE_FORMAT(record_date, '%Y') AS YEAR

FROM
    stats
WHERE
    YEAR = 2009
GROUP BY
    DATE_FORMAT(record_date, '%Y-%m-%d ');

21voto

Salman A Punkte 246207

Wenn Sie Datensätze für ein bestimmtes Jahr (z. B. 2000) filtern möchten, optimieren Sie die WHERE Klausel wie diese:

SELECT MONTH(date_column), COUNT(*)
FROM date_table
WHERE date_column >= '2000-01-01' AND date_column < '2001-01-01'
GROUP BY MONTH(date_column)
-- average 0.016 sec.

Anstelle von:

WHERE YEAR(date_column) = 2000
-- average 0.132 sec.

Die Ergebnisse wurden anhand einer Tabelle mit 300k Zeilen und einem Index für die Datumsspalte erstellt.

Was die GROUP BY Klausel habe ich die drei Varianten anhand der oben genannten Tabelle getestet; hier sind die Ergebnisse:

SELECT YEAR(date_column), MONTH(date_column), COUNT(*)
FROM date_table
GROUP BY YEAR(date_column), MONTH(date_column)
-- codelogic
-- average 0.250 sec.

SELECT YEAR(date_column), MONTH(date_column), COUNT(*)
FROM date_table
GROUP BY DATE_FORMAT(date_column, '%Y%m')
-- Andriy M
-- average 0.468 sec.

SELECT YEAR(date_column), MONTH(date_column), COUNT(*)
FROM date_table
GROUP BY EXTRACT(YEAR_MONTH FROM date_column)
-- fu-chi
-- average 0.203 sec.

Der letzte ist der Gewinner.

18voto

Haijerome Punkte 1510

Wenn Sie in MySQL nach Datum gruppieren möchten, verwenden Sie den folgenden Code:

 SELECT COUNT(id)
 FROM stats
 GROUP BY DAYOFMONTH(record_date)

Ich hoffe, das spart denjenigen, die diesen Thread finden werden, etwas Zeit.

14voto

Cees Timmerman Punkte 15076

Komplette und einfache Lösung mit ähnlicher Leistung, aber kürzer und

SELECT COUNT(*) FROM stats
-- GROUP BY YEAR(record_date), MONTH(record_date), DAYOFMONTH(record_date)
GROUP BY DATE_FORMAT(record_date, '%Y-%m-%d')

10voto

user3019799 Punkte 199

Wenn Sie eine monatliche Statistik mit den Zeilenzahlen pro Monat für jedes Jahr, geordnet nach dem letzten Monat, erhalten möchten, dann versuchen Sie dies:

SELECT count(id),
      YEAR(record_date),
      MONTH(record_date) 
FROM `table` 
GROUP BY YEAR(record_date),
        MONTH(record_date) 
ORDER BY YEAR(record_date) DESC,
        MONTH(record_date) DESC

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