Joh*_*tes 5 mysql datetime 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
Run Code Online (Sandbox Code Playgroud)
现在它返回:
28 23
62 23
14 20
1 4
28 3
19 1
Run Code Online (Sandbox Code Playgroud)
这显示了 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)
Run Code Online (Sandbox Code Playgroud)
或者,您可以按要返回的表达式进行分组:
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 )
Run Code Online (Sandbox Code Playgroud)
如果您想知道,NOW()像这样在同一个查询中多次调用是安全的。从手册:
在查询执行开始时,每个查询仅对返回当前日期或时间的函数求值一次。这意味着在单个查询中多次引用函数(例如 NOW())总是会产生相同的结果。