Mysql 如何计算每半小时的邮件数?

Mysql 如何计算每半小时的邮件数?,mysql,sql,time,Mysql,Sql,Time,考虑下表: 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 hou

考虑下表:

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
这将产生如下结果集:

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),但我不太喜欢。(我也不知道如何使用那张桌子)

非常感谢您的帮助:-)

我想我可以买一张有半小时时间的桌子(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
选择
半小时。从一小时开始,
计数(*)作为计数
从半小时开始
左连接消息
在消息上。\u time>=halfhours.start和消息。\u time
尝试按以下方式分组:

group by hour(_time), floor(minute(_time)/30)

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
选择COUNT(msg_id)作为cnt,CONCAT(CAST(HOUR(_TIME)作为CHAR(2)),':',(CASE WHEN MINUTE(_TIME)<30然后选择'00'否则选择'30'结束)作为小时
来自消息
按CONCAT分组(CAST(小时(_时间)为字符(2)),“:”,(当分钟(_时间)<30时,则为“00”,否则为“30”结束)
按小时订购

为什么该列仍然称为“小时”?也许“时间”更合适?你可以用分钟除以30,再加上小时,再按这个值分组。你可能需要将结果转换为int,我不确定。嘿!这解决了你的问题吗?如果是,请将解决问题的答案标记为帮助他人的正确答案。如果没有,请给我们反馈。Thakns!为了在结果集中获得
10:30、11:00、11:30等
,我使用了rcdmk查询的一部分:
SELECT CONCAT(CAST(HOUR(nyse_时间)AS CHAR(2)),':',(CASE WHEN MINUTE(nyse_时间))和谢谢!我将您和aleroot的查询组合在一起,因为您的查询在结果集中显示了半小时
10:30、11:00、11:30等等,但排序不正确。输出结果是:
0:00、0:30、10:00、10:30
,我不太明白如何解决这个问题。所以我将
选择CONCAT(CAST(HOUR)(纽约证交所时间)作为字符(2) ),“:”,(CASE WHEN MINUTE(纽约证交所时间)很好,你做到了。为了更好地排序,你必须按小时(纽约证交所时间)ASC,分钟(纽约证交所时间)ASC排序,谢谢!这是我的想法,但看看其他建议,在MySQL中没有帮助表是可能的:-)