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
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'
答えの要旨、すなわち計算された表現に対するセレクタの回避は、当然のことながら依然として成り立つ。
... WHERE date_column >='2012-12-25' AND date_column <'2012-12-26'
はDATE
よりもうまく機能する可能性があります(date_columnにインデックスがある場合)。
%
を使うことができます:
SELECT * FROM datetable WHERE datecol LIKE '2012-12-25%'