这实际上取决于您如何定义“不到一天”。
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 秒),分辨率高达一秒,您可以使用如下谓词之一:
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 文本中将当前日期值作为文字传递;MySQL 提供了从 MySQL 服务器返回当前日期和时间的内置函数,例如NOW()
,CURRENT_DATE()
和SYSDATE()
.
对于分别小于 24 小时或 48 小时的行:
WHERE `timestamp` >= DATE_ADD(NOW(),INTERVAL -1 DAY)
WHERE `timestamp` >= DATE_ADD(NOW(),INTERVAL -2 DAY)