web-dev-qa-db-ja.com

MySQL SELECT WHERE datetimeがdayと一致する(必ずしもtimeとは限らない)

Datetime列を含むテーブルがあります。時間に関係なく、特定の日のすべてのレコードを返します。または言い換えれば、私のテーブルに次の4つのレコードしか含まれていない場合は、2012年12月25日に制限すると、2番目と3番目のレコードのみが返されます。

2012-12-24 00:00:00
2012-12-25 00:00:00
2012-12-25 06:00:00
2012-12-26 05:00:00
111
user1032531

NEVER EVERDATE(datecolumns) = '2012-12-24'のようなセレクターを使う - これはパフォーマンスキラーです:

  • 一致しないものも含め、すべての行についてDATE()を計算します。
  • クエリにインデックスを使用することは不可能になります

はるかに速いです

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

これにより、計算なしでインデックスを使用できるようになります。

EDIT

Used_By_Alreadyで指摘されているように、2012年の最初の回答以来、MySQLのバージョンが出現しました。 '23:59:59'を日の終わりとして使用することはもはや安全ではありません。更新されたバージョンは読むべきです

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

答えの要旨、すなわち計算された表現に対するセレクタの回避は、当然のことながら依然として成り立つ。

289
Eugen Rieck

... WHERE date_column >='2012-12-25' AND date_column <'2012-12-26'DATEよりもうまく機能する可能性があります(date_columnにインデックスがある場合)。

30
a1ex07

%を使うことができます:

SELECT * FROM datetable WHERE datecol LIKE '2012-12-25%'
18
Ghilas BELHADJ