それは本当に「1日未満」をどのように定義するかに依存します。
MySQLDATEDIFF
関数は、日時値の日付部分のみを考慮し、整数の日数の差を返します。以下の両方のクエリは、「1日」を表す値1を返します。一方は、8時間の差であり、もう一方は、46時間の差です。
SELECT DATEDIFF('2013-01-15 07:00','2013-01-14 23:00') AS 8_hrs
SELECT DATEDIFF('2013-01-15 23:00','2013-01-14 01:00') AS 46_hrs
したがって、24時間より「古い」行がクエリによって返される可能性があり、予想されます。
(hh:mi:ss
DATEDIFF関数の引数として指定されているリテラルの時間部分は無視され、タイムスタンプ値の時間部分は無視されます。YYYY-MM-DD
値だけを指定しても同じ結果が得られます。)
また、DATEDIFF関数の述語は引数にできないことに注意してください。つまり、MySQLは、その述語を満たすためにインデックスに対して範囲スキャンを実行できません。
最高のパフォーマンスを得るには、通常、裸の列にある同等の述語を優先します。
WHERE `timestamp` >= expr
これにより、オプティマイザは少なくともtimestamp
列のインデックスで範囲スキャンを使用することを検討できます。
1日未満(24時間未満、または86400秒未満を意味する)で、最大1秒の解像度の行を探している場合は、次のいずれかの述語を使用できます。
WHERE `timestamp` >= '2013-01-15 16:10' + INTERVAL -1 DAY
WHERE `timestamp` >= '2013-01-15 16:10' + INTERVAL -24 HOUR
WHERE `timestamp` >= '2013-01-15 16:10' + INTERVAL -86400 SECOND
DATE_ADD関数は同等です。
WHERE `timestamp` >= DATE_ADD('2013-01-15 16:10',INTERVAL -1 DAY)
また、SQLテキストで現在の日付値をリテラルとして渡す必要がないことにも注意してください。NOW()
MySQLには、、、などのMySQLサーバーから現在の日付と時刻を返す組み込み関数が用意されていCURRENT_DATE()
ますSYSDATE()
。
それぞれ24時間未満または48時間前の行の場合:
WHERE `timestamp` >= DATE_ADD(NOW(),INTERVAL -1 DAY)
WHERE `timestamp` >= DATE_ADD(NOW(),INTERVAL -2 DAY)