問い合わせたい
MyDate= '2013-07-08'
以下の記録より
MyDate
2013-07-08 09:15:21
2013-07-08 09:15:48
2013-07-09 09:20:39
私はいくつかの醜いものを思いついた:
MyDate > '2013-07-07 23:59:59' AND MyDate < '2013-07-09 00:00:01'
これを行うためのより良い/シンプル/エレガントな方法はありますか?
DATE()
日時式の日付部分を分離するために使用します。
WHERE DATE(MyDate) = '2013-07-08'
日付を比較しようとしている場合は、これを使用してください。なければ無視。
これは最も完璧な方法ではないかもしれませんが、私は過去にこれを使用しました。基本的に、両方の日付をフォーマットして、以上のステートメント(YEAR/MONTH/DAY)で使用できるようにします。
SELECT * FROM table WHERE MyDate > DATE_FORMAT(2013-07-07 23:59:59, '%Y%m%y') AND MyDate < DATE_FORMAT(2013-07-09 00:00:01, '%Y%m %y')
述語 (WHERE 句など) で DATETIME の日付部分を照合する規範的なパターンは次のとおりです。
WHERE MyDate >= '2013-07-08'
AND MyDate < '2013-07-08' + INTERVAL 1 DAY
時間コンポーネントが指定されていない場合、MySQL は時間コンポーネントとして真夜中を使用するため、真夜中の時間コンポーネントを指定する必要はありません。述語内の裸の列参照により、MySQL は MyDate 列のインデックスに対して効率的な範囲スキャンを行うことを検討できます。
完全を期すために、ETWEEN 演算子を使用することも可能であることに注意してください。ただし、BETWEEN との「ハイサイド」比較は「以下」であるため、1 日の日付コンポーネントを含む値だけを取得するには、時間の最小部分をバックアップする必要があります。これは DATETIME の場合です。は 1 秒です。
WHERE MyDate BETWEEN '2013-07-08'
AND '2013-07-08' + INTERVAL 1 DAY + INTERVAL -1 SECOND
(より細かい解像度を持つデータ型がある場合は、解像度の最小単位で翌日から後退したいと思うでしょう。)
その問題を回避するために、特定の日時/タイムスタンプ データ型 (MySQL よりも SQL Server などの他のデータベースでのより多くの問題) で解像度がどれだけ細かいか、次のような述語を使用して前者のパターンを好みます。
dateexpr >= midnight and dateexpr < midnight of next day
それは明白であり、時間の値を23:59:59.997
見逃す可能性はなく、翌日の真夜中に正確に到達する可能性もありません。
何も指定されていない場合のデフォルトの時刻コンポーネントは午前 0 時であるため、最初のクエリ述語は次のようになります。
WHERE MyDate >= '2013-07-08 00:00:00'
AND MyDate < '2013-07-08 00:00:00' + INTERVAL 1 DAY
真夜中の時間値を明示的に指定するためのこれらの余分なゼロはすべて、不要な混乱だと思います。