2

考虑下表:

msg_id  _time
-------------
1       13:32
2       13:56
3       14:05
4       15:00
5       15:17
6       15:28
7       16:40

我目前正在汇总每小时的消息数量,如下所示:

SELECT HOUR(_time) AS hour, COUNT(msg_id) AS cnt FROM messages GROUP BY hour 
ORDER BY hour

这会产生如下结果集:

hour  cnt
---------
13    2
14    1
15    3
16    1

然而,我想要的是每小时的计数:

hour   cnt
----------
13:30  2
14:00  1
14:30  0
15:00  3
15:30  0
16:00  0
16:30  1

使这成为可能的查询是什么?如有必要,我想我可以使用半小时时间(00:00、00:30、01:00、01:30、... 23:00、23:30)来制作一张桌子,但也不喜欢。(而且我仍然不知道如何使用该表)。

任何帮助是极大的赞赏 :-)

4

3 回答 3

5

您可以使用case when

SELECT COUNT(msg_id) AS cnt, CONCAT(CAST(HOUR(_TIME) AS CHAR(2)), ':', (CASE WHEN MINUTE(_time) < 30 THEN '00' ELSE '30' END)) AS hour
FROM messages
GROUP BY CONCAT(CAST(HOUR(_TIME) AS CHAR(2)), ':', (CASE WHEN MINUTE(_time) < 30 THEN '00' ELSE '30' END))
ORDER BY hour
于 2012-04-08T20:53:21.213 回答
4

我想我可以用半小时的时间(00:00、00:30、01:00、01:30、... 23:00、23:30)制作一张桌子,但也不喜欢。

是的,如果您被迫使用 MySQL,这是正确的解决方案。以另一种方式进行是可能的,但可能会变得混乱并且会更慢。

(而且我仍然不知道如何使用该表)

使用左连接:

SELECT
    halfhours.start AS hour,
    COUNT(*) AS count
FROM halfhours
LEFT JOIN messages
ON messages._time >= halfhours.start AND messages._time < halfhours.end
GROUP BY halfhours.start
于 2012-04-08T20:49:34.103 回答
3

尝试以这种方式分组:

group by hour(_time), floor(minute(_time)/30)
于 2012-04-08T20:51:16.660 回答