2016-03-21 23 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'; 

問題は、私は、彼らが表示されるWHERE句を削除した場合、私は、MySQLの前に書かれたようなクエリを実行する場合、実際には2016年3月20日および2016年3月21日の間に作成されたレコードが存在するということです私に空のセットを与えます。

編集:created_atタイムスタンプ種類あり、それは形式で保存されている2016年3月21日午前13時18分39秒

+2

どのようなタイプはcreated_atとされ、それがどのように保存されていますか? – sagi

+1

上記の予期しない振る舞いを再現できるサンプルデータがないと、説明を思いつくのは難しいでしょう。 – Shadow

答えて

3

私は列created_atは、両方のAが含まれているので、あなたが混乱している疑いがあります日付と時刻のコンポーネント。一つの解決策は、単に日付に変換することです:

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

しかし、私は日付/時刻を使用しているときだけでbetweenを避けた方が良いと思います。間違いをするのは簡単すぎる。その代わり、1秒間<で明示的な比較を使用:

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

アーロン・ベルトラン(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' 
関連する問題