MySQL:过去24小时内按小时插入的记录

时间:2010-05-06 19:08:42

标签: datetime mysql timestamp

我正在尝试列出过去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()而不是在一小时的开始时间有关,我不确定如何获得。

必须有一种更简单的方法。

1 个答案:

答案 0 :(得分:3)

如果按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

  

返回当前日期或时间的函数在查询执行开始时每个查询仅评估一次。这意味着在单个查询中对函数(如NOW())的多次引用始终会产生相同的结果。