2009-06-10 13 views
1

Also was ich versuche zu tun, ist ein bisschen schwierig. Ich versuche, eine SQL-Abfrage, die in der Lage sein wird, Zählungen für bestimmte Zeitrahmen zurückzugeben. Also habe ich einen Tisch 'v'. Hier einige grundlegenden Daten aus Tabelle vMySQL: Abrufen der Anzahl der Datensätze aus einem bestimmten Zeitraum

Table v 
_____________ 
id p_id created_at 
1  1  2009-06-09 18:54:17 
2  2  2009-06-09 21:51:24 
3  2  2009-06-10 18:53:51 
4  1  2009-06-10 01:20:36 
5  1  2009-06-10 11:20:36 

Grundsätzlich mag ich Ergebnisse, um wieder für einen bestimmten Zeitraum (Stunde, Tag, Woche, Monat, Jahr). Ich habe das für Tage etwas arbeiten lassen ... aber ich bin nicht in der Lage, Ergebnisse für Zeitframes zurückzugeben, die eine Zählung von Null enthalten. Grundsätzlich möchte ich ihm einen Zeitrahmen und ein Trennzeichen (Stunde, Tag, etc.) geben und in der Lage sein, die Anzahl der Zeilen von Tabelle v innerhalb dieses Zeitrahmens zu erhalten.

Dies ist, was ich zur Zeit versucht:

select count(*) as count, date_format(created_at, "%m/%d/%y") as date from v where p_id = 56 group by date_format(created_at, "%m/%d/%y"); 

Returns

+-------+-------------------------------------+ 
| count | date_format(created_at, "%m/%d/%y") | 
+-------+-------------------------------------+ 
|  3 | 06/09/09       | 
+-------+-------------------------------------+ 

Aber dies berücksichtigt wird ein Zeitrahmen erfolgt nicht. Irgendwelche Ideen?

Antwort

1

Die übliche Sache, die ich empfehlen würde, tut es mag:

SELECT COUNT(*) AS `num` 
FROM `table` 
WHERE `created_at` >= '2009-09-06 00:00:00' 
AND `created_at` < '2009-09-07 00:00:00' 

das heißt gerade Abfrage in Ihrem Datums-/Zeitbereich, der die Frage der unterschiedlichen Skalen der Zeitspanne Adressen und so weiter. Mit genügend Aufzeichnungen in der Tabelle, ein Index auf created_at kann nutzlos werden, aber es sollte immer noch besser als der Vergleich mit einem DATE_FORMAT Ergebnis; es sei denn, der Abfrageoptimierer ist viel schlauer, als ich ihm zugebe, wird der DATE_FORMAT gegen jede Zeile laufen und das Ergebnis vergleichen, anstatt überhaupt irgendeine Verwendung aus der Indizierung zu bekommen.

Ich vermute, es gibt Dinge, die ich nicht über deine Situation verarbeite, die das für dich nicht funktionieren lassen, oder du würdest es schon so machen, aber ich werde auf Feedback warten müssen, um zu sehen was Diese sind.

0
SELECT 
    COUNT(*) AS cnt, 
    DATE_FORMAT(created_at, "%m/%d/%y") AS my_date 
FROM 
    v 
WHERE 
    p_id = 56 AND 
    created_at BETWEEN first_date AND second_date 
GROUP BY 
    DATE_FORMAT(created_at, "%m/%d/%y");
0

Von Zeitstempel, nicht Daten:

SELECT COUNT (*), DATE_FORMAT (FROM_UNIXTIME (created_at) "% m% y") AS mDate FROM v GROUP BY mDate

0

Sobald Sie für einen bestimmten Zeitraum keinen Datensatz haben, gibt es für den MySQL-Server keine Möglichkeit, diesen Zeitraum zu berechnen. Alle vorgeschlagenen Lösungen (einschließlich Ihrer) funktionieren, aber werden keine Zeilen für einen Zeitrahmen ohne Datensätze zurückgeben.

Wenn Sie diese Abfrage in einer Anwendung verwenden, empfehle ich Ihnen, die Zeilen mit Nullzählung manuell in Ihrem Raster zu erstellen, oder was auch immer Sie verwenden, um die Ergebnisse anzuzeigen.

Verwandte Themen