Ich versuche, nur die heutigen Datensätze aus einer Datenbanktabelle auszuwählen.
Derzeit benutze ich
SELECT * FROM `table` WHERE (`timestamp` > DATE_SUB(now(), INTERVAL 1 DAY));
Dies erfordert jedoch Ergebnisse für die letzten 24 Stunden, und ich brauche sie, um nur Ergebnisse von heute auszuwählen und die Zeit zu ignorieren. Wie kann ich Ergebnisse nur anhand des Datums auswählen?
Using where; Using index
?timestamp
(unddate
wie in meinem Fall) ein von MySQL reserviertes Wort istWenn Sie möchten, dass ein Index verwendet wird und die Abfrage keinen Tabellenscan durchführt:
Um den Unterschied zu zeigen, den dies für die tatsächlichen Ausführungspläne bedeutet, testen wir mit einer SQL-Fiddle (eine äußerst hilfreiche Site):
Probieren wir jetzt die 2 Versionen aus.
Version 1 mit
DATE(timestamp) = ?
Erklären:
Es filtert alle (6671) Zeilen und führt dann eine Dateisortierung durch (dies ist kein Problem, da nur wenige Zeilen zurückgegeben werden).
Version 2 mit
timestamp <= ? AND timestamp < ?
Erklären:
Es verwendet einen Bereichsscan für den Index und liest dann nur die entsprechenden Zeilen aus der Tabelle.
quelle
INDEX t_IX (timestamp, id)
könnte (sollte?) einfach seinINDEX t_IX (timestamp)
, da der Primärschlüssel im Index impliziert ist. oder gibt es einen Grund, warum ich das nicht verstehe? Ich habe es in SQL-Fiddle versucht und sah den gleichen (besseren) Ausführungsplanid
(da es sich um die PK und damit um den Clustered-Index der Tabelle handelt) trotzdem an den Index angehängt. Es tut also nicht weh, es explizit hinzuzufügen (und es kann einige blinde Flecken des Optimierers erkennen). Es ist in diesem Fall / Abfrage sicherlich nicht relevant.timestamp < CURDATE() + INTERVAL 1 DAY
das notwendig ist?es ist kürzer, es muss nicht 'AND timestamp <CURDATE () + INTERVAL 1 DAY' verwendet werden.
weil CURDATE () immer den aktuellen Tag zurückgibt
MySQL CURDATE () Funktion
quelle
Wie viele Möglichkeiten können wir diese Katze häuten? Hier ist noch eine andere Variante.
SELECT * FROM
table
WHERE DATE (FROM_UNIXTIME (timestamp
)) = '2015-11-18';quelle
Wenn Sie mit einem bestimmten Datum vergleichen möchten, können Sie es direkt wie folgt schreiben:
// hier ist der Zeitstempel der Name der Spalte mit dem Typ als Zeitstempel
oder
Zum Abrufen des heutigen Datums steht die Funktion CURDATE () zur Verfügung.
quelle
Wirf es einfach auf ein Datum:
quelle
Dies könnte meiner Meinung nach am einfachsten sein:
quelle
Oder Sie können die Alternative CURRENT_DATE mit demselben Ergebnis verwenden:
Beispiele aus database.guide
quelle
In Visual Studio 2017 musste ich unter Verwendung der integrierten Datenbank für die Entwicklung Probleme mit der aktuell angegebenen Lösung haben. Ich musste den Code ändern, damit er funktioniert, da der Fehler ausgegeben wurde, dass DATE () keine integrierte Funktion war.
Hier ist meine Lösung:
where CAST(TimeCalled AS DATE) = CAST(GETDATE() AS DATE)
quelle