Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Aus dem Zeitstempel in SQL, Auswahl von Datensätzen von heute, gestern, dieser Woche, diesem Monat und zwischen zwei Daten php mysql

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')