2016-03-21 5 views
-1

У меня есть запрос.MySQL - интервал даты не работает должным образом

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

Проблема заключается в том, что есть записи, созданные между 2016-03-20 и 2016-03-21, на самом деле, если я удалю ИНЕКЕ они появляются, но если я запускаю запрос подобное написано до Mysql дает мне пустой набор.

Edit:created_at является метки времени типа и сохраняются в формате 2016-03-21 13:18:39

+2

Какой тип created_at и как она хранится? – sagi

+1

Без выборочных данных, на которых мы можем представить вышеприведенное неожиданное поведение, будет трудно найти какое-либо объяснение. – Shadow

ответ

3

Я подозреваю, что вы смущены, потому что столбец created_at содержит как даты и времени. Одно из решений заключается в преобразовании его просто дата:

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

Однако, я думаю, что лучше просто избегать between при использовании даты/времени. Слишком легко совершить ошибку. Вместо этого, используйте явные сравнения с < для второго:

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

Aaron Bertrand (а SQL Server MVP) написал blog об этой теме. Хотя он направлен на SQL Server, совет по between применяется к большинству баз данных, включая MySQL.

0

Вы можете использовать DATE(search_logs.created_at) или использовать операторы сравнения, как это:

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' 
Смежные вопросы