Ich habe eine Spalte vom Typ "datetime" mit Werten wie 2009-10-20 10:00:00
Ich möchte Datum aus Datum / Uhrzeit extrahieren und eine Abfrage schreiben wie:
SELECT * FROM
data
WHERE datetime = '2009-10-20'
ORDER BY datetime DESC
Ist das Folgende der beste Weg, dies zu tun?
SELECT * FROM
data
WHERE datetime BETWEEN('2009-10-20 00:00:00' AND '2009-10-20 23:59:59')
ORDER BY datetime DESC
Dies gibt jedoch eine leere Ergebnismenge zurück. Irgendwelche Vorschläge?
Die Verwendung
WHERE DATE(datetime) = '2009-10-20'
hat Leistungsprobleme . Wie hier angegeben :DATE()
für alle Zeilen berechnet , auch für diejenigen, die nicht übereinstimmen.Verwenden Sie
BETWEEN
oder>
,<
,=
Operatoren , die erlauben , einen Index zu verwenden:Update: Die Auswirkungen auf die Verwendung
LIKE
von Operatoren anstelle von Operatoren in einer indizierten Spalte sind hoch . Dies sind einige Testergebnisse für eine Tabelle mit 1.176.000 Zeilen:datetime LIKE '2009-10-20%'
=> 2931msdatetime >= '2009-10-20 00:00:00' AND datetime <= '2009-10-20 23:59:59'
=> 168msBei einem zweiten Aufruf über dieselbe Abfrage ist der Unterschied sogar noch größer: 2984 ms gegenüber 7 ms (ja, nur 7 Millisekunden!). Ich habe dies gefunden, als ich alten Code für ein Projekt mit Hibernate neu geschrieben habe.
quelle
DATE(datetime)
,BETWEEN AND
um die Szenen zu betrachten, erhalten wir eine kurze Aussage und eine coole Leistung. Warum nicht? Warum haben sie das nicht getan? :)DATE(datetime) in (:list)
nicht funktioniertBETWEEN
Sie können die Datums- und Uhrzeitangabe auf den YMD-Teil formatieren:
quelle
DATE_FORMAT(datetime, '%H:%i:%S')
Obwohl alle Antworten auf der Seite das gewünschte Ergebnis liefern, weisen alle Leistungsprobleme auf. Führen Sie niemals Berechnungen für Felder in der
WHERE
Klausel (einschließlich einerDATE()
Berechnung) durch, da diese Berechnung für alle Zeilen in der Tabelle durchgeführt werden muss.Das
BETWEEN ... AND
Konstrukt ist für beide Randbedingungen inklusive und erfordert, dass die Syntax 23:59:59 am Enddatum angegeben wird, die selbst andere Probleme aufweist (Mikrosekunden-Transaktionen, die MySQL meiner Meinung nach 2009 nicht unterstützt hat, als die Frage gestellt wurde).Die richtige Methode zum Abfragen eines MySQL-
timestamp
Felds für einen bestimmten Tag besteht darin, nach Größer als Gleich am gewünschten Datum und nach Weniger als am Tag danach zu suchen, ohne dass eine Stunde angegeben ist.Dies ist die Methode mit der schnellsten Leistung, dem geringsten Arbeitsspeicher und der geringsten Ressourcenintensität und unterstützt zusätzlich alle MySQL-Funktionen und Eckfälle, z. B. die Genauigkeit von Zeitstempeln unter einer Sekunde. Darüber hinaus ist es zukunftssicher.
quelle
Hier sind alle Formate
Angenommen, dies ist die Spalte, die den
datetime
Wert table enthältdata
.quelle
Sie können verwenden:
Oder:
Oder:
quelle
einfache und beste Möglichkeit, die Datumsfunktion zu verwenden
Beispiel
ODER
quelle
Die Verwendung der
LIKE
Anweisung in istWHERE datetime LIKE '2009-10-20%'
in diesem Fall die beste Optionquelle