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

MySQL SELECT WHERE datetime match day (und nicht unbedingt time)

NIEMALS Verwenden Sie einen Selektor wie DATE(datecolumns) = '2012-12-24' - es ist ein Leistungskiller:

  • Es wird DATE() berechnet für alle Zeilen, einschließlich derer, die nicht übereinstimmen
  • es wird es unmöglich machen, einen Index für die Abfrage zu verwenden

Es ist viel schneller zu verwenden

SELECT * FROM tablename 
WHERE columname BETWEEN '2012-12-25 00:00:00' AND '2012-12-25 23:59:59'

da dies die Verwendung des Index ohne Berechnung ermöglicht.

BEARBEITEN

Wie von Used_By_Already betont, sind in der Zeit seit der ersten Antwort im Jahr 2012 Versionen von MySQL aufgetaucht, bei denen die Verwendung von „23:59:59“ als Tagesende nicht mehr sicher ist. Eine aktualisierte Version sollte lauten

SELECT * FROM tablename 
WHERE columname >='2012-12-25 00:00:00'
AND columname <'2012-12-26 00:00:00'

Der Kern der Antwort, d. h. die Vermeidung eines Selektors bei einem berechneten Ausdruck, bleibt natürlich bestehen.