Wenn Sie nur nach Datum auswählen, stützen Sie Ihre Berechnungen auf CURDATE
(der nur das Datum zurückgibt) und nicht NOW
(der Datum und Uhrzeit zurückgibt). Diese Beispiele erfassen alle Zeiten innerhalb der Tagesbereiche:
- Heute:
WHERE timestamp >= CURDATE()
- Gestern:
WHERE timestamp >= DATE_SUB(CURDATE(), INTERVAL 1 DAY) AND timestamp < CURDATE()
- Diesen Monat:
WHERE timestamp >= DATE_SUB(CURDATE(), INTERVAL DAYOFMONTH(CURDATE())-1 DAY)
- Zwischen den beiden Daten 3. Juni 2013 und 7. Juni 2013 (beachten Sie, dass das Enddatum auf den 8. Juni und nicht auf den 7. Juni festgelegt ist):
WHERE timestamp >= '2013-06-03' AND timestamp < '2013-06-08'
Das „diese Woche“ hängt davon ab, an welchem Tag Sie Ihre Woche beginnen; Das überlasse ich Ihnen. Sie können den DAYOFWEEK
Funktion, um CURDATE()
zu optimieren in die richtigen Bereiche.
Nachtrag :Der Spaltentyp von OP war INTEGER
, Speichern eines UNIX-Zeitstempels, und meine Antwort ging davon aus, dass der Spaltentyp TIMESTAMP
war . Hier erfahren Sie, wie Sie dieselben Dinge mit einem UNIX-Zeitstempelwert tun und trotzdem die Optimierung beibehalten, wenn die Spalte indiziert ist (wie es die obigen Antworten tun, wenn der TIMESTAMP
Spalte ist indiziert)...
Grundsätzlich besteht die Lösung darin, einfach das Anfangs- und/oder Enddatum in UNIX_TIMESTAMP
Funktion:
- Heute:
WHERE timestamp >= UNIX_TIMESTAMP(CURDATE())
- Gestern:
WHERE timestamp >= UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL 1 DAY)) AND timestamp < UNIX_TIMESTAMP(CURDATE())
- Diesen Monat:
WHERE timestamp >= UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL DAYOFMONTH(CURDATE())-1 DAY))
- Zwischen den beiden Daten 3. Juni 2013 und 7. Juni 2013 (beachten Sie, dass das Enddatum als 8. Juni angegeben ist, nicht als 7. Juni):
WHERE timestamp >= UNIX_TIMESTAMP('2013-06-03') AND timestamp < UNIX_TIMESTAMP('2013-06-08')