2010-05-06 126 views
5

我试图列出过去24小时插入数据库的每小时记录数。每行显示当天插入的记录,以及多少小时前的记录。MySQL:按小时插入记录,在过去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()有关,而不是在一小时的开始时间,我不确定如何获得。

必须有一个更简单的方法来做到这一点。

回答

4

如果通过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()等函数的多次引用始终会产生相同的结果。