最近在项目中遇到一个问题,需要对表中的数据按照一个给定的时间分组并统计个数,网上查了一些资料,大部分都是按月或者天这样的,如果说存在按每隔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下就可以直接用参数调出不同间隔的分组