日時列を含むテーブルがあります。時間に関係なく、特定の日のすべてのレコードを返したいです。つまり、テーブルに次の 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
次のようなセレクターは絶対に使用しない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'
答えの要点、つまり計算式でのセレクターの回避は、もちろんまだ有効です。
... WHERE date_column >='2012-12-25' AND date_column <'2012-12-26'
(date_column にインデックスがある場合) よりもうまく機能する可能性がありますDATE
。