Wählen Sie Zeilen, die weniger als 5 Minuten alt mit DATE_SUB
Ich habe eine Tabelle, die immer Hunderte von Anfragen pro minute. Das Problem, das ich habe ist, dass ich brauche einen Weg, um wählen Sie nur die Zeilen, die eingefügt wurden in den letzten 5 Minuten. Ich versuche dieses:
SELECT count(id) as count, field1, field2
FROM table
WHERE timestamp > DATE_SUB(NOW(), INTERVAL 5 MINUTE)
ORDER BY timestamp DESC
Mein Problem ist, dass es gibt 70k+ Ergebnisse und das zählen. Ich bin mir nicht sicher, was ich falsch mache, aber ich würde lieben zu bekommen einige Hilfe auf diesem. Darüber hinaus, wenn es eine Möglichkeit zum gruppieren von minute zu haben, es so Aussehen:
| count | field1 | field2 |
----------------------------
Ich würde gerne die Hilfe und Führung auf diese, so lassen Sie bitte mich wissen Sie Ihre Gedanken.
- Was ist der Typ von
timestamp
Spalte? - es ist ein datetime -, würde das einen Unterschied machen?
- Es macht großen Unterschied, wie einige Leute benutzen
INT
für die Speicherung von Zeitstempeln. Auch unterscheidet es sich vonTIMESTAMP
geben, weilDATETIME
behandelt wird wörtlich und nicht die Einstellung für die Zeitzone. Kann dies das problem sein - vergleichen Sie die Zeitstempel der zuletzt eingefügten Eintrag mit dem Ergebnis desSELECT NOW();
und lassen Sie uns wissen, über die Werte der beiden. - Denken Sie daran, zu tun, die Abfrage auf genau die gleiche Datenbank abgefragt, die in Ihrer Frage. Es hat einige der Zeitzone-Einstellungen, die Einfluss auf die Ergebnisse.
- das ist sicherlich einen großen Unterschied gemacht. Ich bin mir fast sicher, dass das funktioniert jetzt. Der einzige Grund, warum ich mich zu hinterfragen ist, weil meine original-datetimes waren eine Stunde oder so vor der Maschine ist an der Zeit, so hat es nicht übertroffen, das alte datetimes noch. Ich werde Sie wissen lassen, kurz
- Dies ist generell eine gute Idee, verwenden Sie das gleiche Schema, zB. 1) speichern der Unix-Epoche Integer in der Datenbank, oder 2) die Umwandlung von Unix-Epoche zahlen der
TIMESTAMP
Spalten und wieder auf die Datenbank-Schicht oder 3) konvertieren von Unix-Epoche-zahlen inDATETIME
strings und zurück auf dem application layer. Ansonsten gibt es einen Platz für die Zeitzone überein.
InformationsquelleAutor Tom Sampson | 2012-02-02
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Sie nicht wirklich brauchen
DATE_ADD/DATE_SUB
-, Datums-Arithmetik ist viel einfacher:Folgende scheint, wie es wäre Arbeit, die mächtigen in der Nähe zu dem, was Sie hatte:
Beachten Sie die hinzugefügte Spalte zu zeigen, die minute und die GROUP BY-Klausel, sammelt die Ergebnisse in der entsprechenden minute. Stell dir vor, du hatte 5 kleine Eimer beschriftet mit den letzten 5 Minuten. Jetzt stellen Sie sich vor Sie geworfen, jede Zeile, die war 4 Minuten alt in einen eigenen Eimer. count() zählt die Anzahl der Einträge in jedem Eimer. Das ist eine schnelle Visualisierung auf, wie die GRUPPE VON Werken. http://www.tizag.com/mysqlTutorial/mysqlgroupby.php zu sein scheint, einen anständigen Kommentar auf GRUPPE, wenn Sie weitere Informationen benötigen.
Wenn Sie ausgeführt werden, und die Anzahl der Einträge in jeder minute zu hoch erscheint, werden Sie wollen, um einige der Fehlersuche. Versuchen Sie ersetzen COUNT(id) mit MAX(date_field) und MIN(date_field), so dass Sie können erhalten eine Idee, welche Art von Terminen es sich um die Erfassung. Wenn MIN() und MAX() sind innerhalb der Reichweite, die Sie haben können mehr Daten geschrieben, um Ihre Datenbank, als Sie denken.
Könnten Sie auch überprüfen, dass Sie nicht über Termine in der Zukunft, als wären Sie alle > jetzt(). Die MIN()/MAX() überprüft, die oben erwähnt, sollten angeben, dass, wenn das ist ein problem.