153

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

4 に答える 4

376

次のようなセレクターは絶対に使用しない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 年の最初の回答以来、'23:59:59' を 1 日の終わりとして使用することがもはや安全ではないバージョンの MySQL が出現しました。更新されたバージョンは読む必要があります

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

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

于 2012-12-31T17:24:07.770 に答える
40

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

于 2012-12-31T17:23:13.433 に答える