我正在尝试列出过去 24 小时内每小时插入数据库的记录数。每行显示该小时插入的记录,以及几小时前插入的记录。
现在这是我的查询:
SELECT COUNT(*), FLOOR( TIME_TO_SEC( TIMEDIFF( NOW(), time)) / 3600 )
FROM `records`
WHERE time > DATE_SUB(NOW(), INTERVAL 24 HOUR)
GROUP BY HOUR(time)
ORDER BY time ASC
现在它返回:
28 23
62 23
14 20
1 4
28 3
19 1
显示 23 小时前的两行,而当时它应该每小时只显示一行。 我认为这与使用 NOW() 而不是在一小时开始时获取时间有关,我不确定如何获取时间。
一定有更简单的方法来做到这一点。
最佳答案
如果您按 HOUR(time)
分组,那么您应该在选择表达式中使用 HOUR(time)
,而不是 time
。例如:
SELECT HOUR(time), COUNT(*)
FROM `records`
WHERE time > DATE_SUB(NOW(), INTERVAL 24 HOUR)
GROUP BY HOUR(time)
ORDER BY HOUR(time)
或者,您可以按要返回的表达式进行分组:
SELECT COUNT(*), FLOOR( TIME_TO_SEC( TIMEDIFF( NOW(), time)) / 3600 )
FROM `records`
WHERE time > DATE_SUB(NOW(), INTERVAL 24 HOUR)
GROUP BY FLOOR( TIME_TO_SEC( TIMEDIFF( NOW(), time)) / 3600 )
ORDER BY FLOOR( TIME_TO_SEC( TIMEDIFF( NOW(), time)) / 3600 )
如果您想知道,在同一个查询中多次调用 NOW()
是安全的。来自manual :
Functions that return the current date or time each are evaluated only once per query at the start of query execution. This means that multiple references to a function such as NOW() within a single query always produce the same result.
关于datetime - MySQL:过去 24 小时按小时插入的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2783740/