Mysql 按给定时间分组

最近在项目中遇到一个问题,需要对表中的数据按照一个给定的时间分组并统计个数,网上查了一些资料,大部分都是按月或者天这样的,如果说存在按每隔5秒一个分组的话就不太好实现。最后自己实现了一个,大概有两种思路:

一、通过字符串截取

SELECT DATE_ADD(CONCAT(DATE_FORMAT(XXXX,'%Y-%m-%d %H:%i:%s'),FLOOR(SECOND(XXXX)/5),""),INTERVAL 5 SECOND) TIME,COUNT(*) count
FROM  table
WHERE TIMESTAMPDIFF (SECOND ,XXXX, DATE_ADD(NOW(),INTERVAL -10 SECOND)) < 3600*24*10
GROUP BY 
DATE_ADD(CONCAT(DATE_FORMAT(XXXX,'%Y-%m-%d %H:%i:%s'),FLOOR(SECOND(XXXX)/5),""),INTERVAL 5 SECOND)
ORDER BY TIME


大致就是把时间段尾部截取,然后按需求加上尾部,在统计count.

这样做比较麻烦,而且有一个明显的缺点,比如我要求间隔是80S的话就不能满足


二、通过时间戳转换


SELECT  FROM_UNIXTIME((FLOOR(UNIX_TIMESTAMP(XXXX)/5))*5,'%Y-%m-%d %H:%i:%s') time,COUNT(*) value
FROM table
WHERE TIMESTAMPDIFF (SECOND ,XXXX, DATE_ADD(NOW(),INTERVAL -10 SECOND)) < 3600*24*30
GROUP BY
FROM_UNIXTIME((FLOOR(UNIX_TIMESTAMP(XXXX)/5))*5,'%Y-%m-%d %H:%i:%s')
ORDER BY time


先将时间转换为时间戳类型,对时间戳进行分组,最后在转换成日期类型,能够较好的满足要求,在ibatis下就可以直接用参数调出不同间隔的分组

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值