我有一个简单的表,在下面的示例中具有一个名为 timeC
的 TIME 列。我想选择 timeC 在过去五分钟内的所有记录。我已经尝试了以下和许多变体,但没有成功。
SELECT * FROM sample_schema.`exampleTable`
WHERE MINUTE(TIMEDIFF(SELECT TIME(NOW())), `timeC`)<5;
请注意,该列是 TIME,而不是 DATETIME 或 TIMESTAMP。
建议?
您的括号在错误的位置。因此,您使用 1 个参数调用TIMEDIFF()
,并使用 2 个参数调用MINUTE()
。另外,您不需要使用 SELECT
来获取TIME(NOW())
,您只需将该函数调用用作参数即可。
SELECT *
FROM exampleTable
WHERE MINUTE(TIMEDIFF(TIME(NOW()), timeC)) < 5
但是,这仍然存在问题。 如果当天晚些时候timeC
TIMEDIFF()
可以返回负时间,但MINUTE()
始终返回分钟的正值,因此这将匹配 5 分钟前到 5 分钟后的任何内容。最好简单地将时间与范围进行比较:
SELECT *
FROM exampleTable
WHERE timeC BETWEEN TIME(DATE_SUB(NOW(), INTERVAL 5 MINUTE)) AND TIME(NOW())
有一个令人讨厌的问题。如果在午夜后不久执行此查询,则提前 5 分钟的时间将是前一天的较晚时间。例如,如果它当前00:02
,则 5 分钟前将是23:57
,并且没有任何内容与BETWEEN
表达式匹配。您需要检查:
SELECT *
FROM exampleTable
WHERE CASE
WHEN TIME(NOW()) >= '00:05'
THEN timeC BETWEEN TIME(DATE_SUB(NOW(), INTERVAL 5 MINUTE)) AND TIME(NOW())
ELSE timeC BETWEEN '00:00' AND TIME(NOW())
OR
timeC BETWEEN TIME(DATE_SUB(NOW(), INTERVAL 5 MINUTE)) AND '23:59:59'
END