需求:将数据库中每分钟一条的数据表,从9:30取到22:00 ,以半小时为单位汇总,并输出excel。
数据表字段:id(序号)、incount(计数)、cdate(数据时间)
表名:m_temp
难点:时间处理
解决办法:使用DATE_FORMAT、CONCAT、Date、Hour、Minute、Floor函数将时间处理成半小时,在将这段时间的数据查询时 输出cdate统一变为 09:30,然后在group by cdate ,用sum(incount)求和。
1.处理时间:
示例:2018-08-21 09:30:00 至 2018-08-21 22:00:00
第一个半小时 09:30 至 10:00
将这段时间的数据查询时 输出cdate统一变为 09:30,然后在group by cdate ,sum(incount)
将分钟取出 /30 , 0-29分 结果为0 ,30-59分 结果为1 在乘以30 分钟即变为00 或者 30
date(cdate),取出年月日;
hour(cdate),取出小时;
minute(cdate),取出分钟;
计算(minute(cdate))/30 )*30,结果为0或30;
floor( (minute(cdate))/30 )*30), 处理成整数;
concat(date(cdate),' ',hour(cdate),':',floor( (minute(cdate))/30 )*30) ,按照日期格式进行拼接
DATE_FORMAT( concat(date(cdate),' ',hour(cdate),':',floor( minute(cdate)/30 )*30+12) ,'%Y-%m-%d %H:%i') ,转换成date类型
完整sql:
select sum(incount),dataStartTime from (
select incount, DATE_FORMAT( concat(date(cdate),' ',hour(cdate),':',floor( minute(cdate)/30 )*30+12) ,'%Y-%m-%d %H:%i') as dataStartTime
from m_temp WHERE cdate>='2018-08-21 09:30' and cdate<='2018-08-21 22:00' ORDER BY dataStartTime
) a
group by DATE_FORMAT( dataStartTime ,'%Y-%m-%d %H:%i')
into outfile('c:/2018-08-21Data.xls');