最近跑去做后端了,刚上来就碰到一个问题,要把数据按时间段统计,可我数据库都还给老师了……于是跑去学习了一下
以下数据均为假设,我是参考着我另一台电脑上数据写的……所以哪里错了别打我
先假设一个表,就叫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 |
以上的代码由于用到了 group by
,所以输出的内容如果不是个集合( count
啊 sum
之类的),就会报错。
上面的查询语句主要操作大概是:
首先用 date_format()
函数把输出格式化成整小时
这种情况下不管18点零几分都会输出成18点
即 18:11:12
啊 18: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
然后再老样子格式化查找,最后集合起来输出。