美文网首页
Mysql按不同时间粒度分组集合输出

Mysql按不同时间粒度分组集合输出

作者: 景山道人 | 来源:发表于2019-12-11 16:16 被阅读0次

最近跑去做后端了,刚上来就碰到一个问题,要把数据按时间段统计,可我数据库都还给老师了……于是跑去学习了一下

以下数据均为假设,我是参考着我另一台电脑上数据写的……所以哪里错了别打我

先假设一个表,就叫table吧

time_stamp user_id money_store
2019-12-11 18:11:12 zhangsan 1000
2019-12-11 19:10:01 zhangsan 2000
2019-12-11 19:20:01 zhangsan 1000
2019-12-12 09:01:02 zhangsan 2000

内容里面有只隔了一个小时的,有隔了一天的
那么如果要把11号这天张三存的钱统计起来,并按每小时输出,我们可以:

select date_format(time_stamp,%Y-%m-%d %H:00:00) as hour,
sum(money_store) as total
from table
where time_stamp between '2019-12-11' and '2019-12-12'
group by time_stamp

输出大概是:

time_stamp total
2019-12-11 18:00:00 1000
2019-12-11 19:00:00 3000

关于date_format()函数及其参数含义可以看这里

以上的代码由于用到了 group by ,所以输出的内容如果不是个集合( countsum 之类的),就会报错。
上面的查询语句主要操作大概是:
首先用 date_format() 函数把输出格式化成整小时
这种情况下不管18点零几分都会输出成18点
18:11:1218:55:56 啥的输出都是 18:00:00
在这个前提下用这个输出的整点列来 group by,结果就是按照整小时统计输出的数据了

在这个思路下,按照天啊分钟啊之类的时间段分组,差别实际上就只在date_format()函数的写法上而已

具体建议看这里 下面那部分我和链接里写的不太一样,因为表不同,输出的需求也不同,我学的人家的,建议以人家的为准

特别地,如果要按半小时输出,大概可以写:

select date_format(
concat(date(time_stamp),
' ',
hour(time_stamp),
':',
floor(minute(time_stamp)/30)*30),
'%Y-%m-%d %H:%i') as time_format,
sum(money_store) as total
from table
group by time_format

大意是把 time_stamp 全都做成整半个小时的样子,为此需要自己重建一个时间格式出来,只要拼成日期+小时+30分钟的样子就行(顺便,看到除完再乘同一个数,在我的经验里都是在取整)
date_format() 函数里面基本就在干这个。
拼接的方式不固定,样子对了就行了,所以我们这么写也一样:

select date_format(
concat(
date_format(time_stamp,'%Y-%m-%d %H'),
':',
floor(minute(time_stamp)/30)*30),
'%Y-%m-%d %H:%i') as time_format,
sum(money_store) as total
from table
group by time_format

然后再老样子格式化查找,最后集合起来输出。

相关文章

网友评论

      本文标题:Mysql按不同时间粒度分组集合输出

      本文链接:https://www.haomeiwen.com/subject/tktagctx.html