MySQL SELECT WHERE日時は日と一致します(必ずしも時刻とは限りません)


127

日時列を含むテーブルがあります。時間に関係なく、特定の日のすべてのレコードを返したいです。または、言い換えると、テーブルに次の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

回答:


326

決してセレクターを使用しないでくださいDATE(datecolumns) = '2012-12-24'-それはパフォーマンスキラーです:

  • DATE()一致しないものも含めて、すべての行を計算します
  • クエリにインデックスを使用できなくなります

使用する方がはるかに速い

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

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

編集

Used_By_Alreadyが指摘しているように、2012年の最初の回答以降、MySQLのバージョンが登場し、「23:59:59」を1日の終わりとして使用することは安全ではなくなりました。更新されたバージョンは

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

答えの要点、つまり計算された式でのセレクターの回避は、もちろんまだ有効です。


私はa1ex07のソリューションが他のソリューションほど良くないようだとコメントしようとしていました。あなたの投稿を読んだ後、多分私は私の考えを逆にする必要があります!
user1032531

2
2つのサーバーでテストしたところ、特に巨大なテーブルの場合、上記はdate()= ''よりもはるかに高速です(少なくとも10倍)。ありがとう
zzapper 2014

1
@KonradViltersten私は非常に冗長な方法を使用してクエリをフレーズ化し、より読みやすくして、ポイントを絞り込み、洗練させませんでした。a1ex07の回答には、スパース構文があります。
Eugen Rieck 2014

9
@KonradViltersten-さらに良い:WHERE col >= '2012-12-25' AND col < '2012-12-25' + INTERVAL 1 DAY。これは、0時間を回避し、ために働くDATEDATETIMEDATETIME(6)、などとなど閏日、との取引
リック・ジェームス

1
「2012-12-25 23:59:59」は1日の終わりとして有効ではありません。常に悪い考えであり、1秒未満の時間精度をサポートするMySQLのバージョンにバグを引き起こします。Rick James(上記)またはa1ex07(その他の回答)によるアプローチを使用する方がはるかに良い
Used_By_Already

34

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


1
私は実際には何が速いのだろうと思います-これまたはBETWEEN解決策...
jave.web 2015

6
違いはないはずです。BETWEENは書く方法field >= value1 and fied<= value2です。
a1ex07

1
MySQLマニュアルによると、「日付または時刻の値でBETWEENを使用する場合に最良の結果を得るには、CAST()を使用して、値を目的のデータ型に明示的に変換します。例:DATETIMEを2つのDATE値と比較する場合は、DATEを変換します。値をDATETIME値に変換します。DATEとの比較で '2001-1-1'などの文字列定数を使用する場合は、文字列をDATEにキャストしてください。したがって、それらがすべて同じ型でない限り、明示的にキャストするのが最善です。
techdude

21

使用できます %

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

13
LIKEはDATE(datetimecol)と同じくらい遅いようです。Eugenまたはa1ex07のソリューションを使用することをお勧めします。
Marie Fischer

3
それは常に速度についてではありません。だから私はこのソリューションが好きです。それははるかに読みやすいです。
Simon Hansen、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.