sql >> データベース >  >> RDS >> Mysql

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

    決して 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のバージョンが登場し、1日の終わりとして「23:59:59」を使用することはもはや安全ではありません。更新されたバージョンは読む必要があります

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

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



    1. SQLiteで1年の最初の月曜日を取得

    2. 例によるフラスコ– Postgres、SQLAlchemy、およびAlembicのセットアップ

    3. 3SQLクエリのパフォーマンスを遅らせる厄介なI/O統計

    4. SQLServerの単一行MERGE/upsertの構文