2016-03-21 14 views
-1

Ich habe diese Abfrage-Anweisung.MySQL - Datumsintervall funktioniert nicht richtig

SELECT categories.cat_name, search_logs.created_at 
FROM (search_logs INNER JOIN categories ON search_logs.qry_category = categories.code) 
WHERE search_logs.created_at between '2016-03-20' and '2016-03-21'; 

Das Problem ist, dass es Aufzeichnungen zwischen 2016.03.20 erstellt sind und 2016.03.21, in der Tat, wenn ich entfernen Sie die WHERE-Klausel sie erscheinen, aber wenn ich die Abfrage ausführen wie das vor Mysql geschrieben gibt mir einen leeren Satz.

Edit:created_at ist ein Zeitstempel Typ und es wird im Format 2016-03-21 13:18:39

+2

Welche Art ist created_at und wie gespeichert wird? – sagi

+1

Ohne Beispieldaten, auf die wir das obige unerwartete Verhalten zurückführen können, wird es schwierig sein, irgendeine Erklärung zu finden. – Shadow

Antwort

3

ich Sie verwirrt sind vermuten gespeichert, da die Spalte created_at enthält sowohl ein Datum und eine Zeitkomponente. Eine Lösung ist es nur ein Datum zu konvertieren:

WHERE date(search_logs.created_at) between '2016-03-20' and '2016-03-21'; 

Aber ich denke, dass es besser ist, einfach between zu vermeiden, wenn Datum mit/Zeiten. Es ist zu einfach, einen Fehler zu machen. Verwenden Sie stattdessen explizite Vergleiche mit < für die zweiten:

WHERE search_logs.created_at >= '2016-03-20' and 
     search_logs.created_at < '2016-03-22'; 

Aaron Bertrand (ein SQL Server MVP) ein blog zu diesem Thema geschrieben hat. Obwohl es auf SQL Server ausgerichtet ist, gilt der Hinweis auf between für die meisten Datenbanken, einschließlich MySQL.

0

können Sie DATE(search_logs.created_at) verwenden oder die Vergleichsoperatoren wie folgt verwenden:

SELECT categories.cat_name, search_logs.created_at 
FROM (search_logs INNER JOIN categories ON search_logs.qry_category = categories.code) 
WHERE search_logs.created_at >= '2016-03-20' and search_logs.created_at < '2016-03-21'