我试图列出过去 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 http://dev.mysql.com/doc/refman/5.0/en/date-and-time-functions.html:
每个返回当前日期或时间的函数在查询执行开始时仅对每个查询求值一次。这意味着在单个查询中对诸如 NOW() 之类的函数的多次引用始终会产生相同的结果。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)