最近项目需要统计一段日期范围内,根据每分钟、几分钟、每天分别统计汇总某些事件/指标的发生总次数,平均发生次数,因此总结了Mysql中与时间处理、统计相关的资料。

按分钟统计某一时间段内的数据

SELECT count(1), date_format(a5_firsttime, "%H:%i") as t from ccb_alerts group by t order by null

这个统计汇总方法,可以按照每天、工作日(周一至周五)、小时、分钟、月等维度来汇总统计。Mysql的日期输出格式可以参考下面:

输出格式

含义

%a

缩写星期名

%b

缩写月名

%c

月,数值

%D

带有英文前缀的月中的天

%d

月的天,数值(00-31)

%e

月的天,数值(0-31)

%f

微秒

%H

小时 (00-23)

%h

小时 (01-12)

%I

小时 (01-12)

%i

分钟,数值(00-59)

%j

年的天 (001-366)

%k

小时 (0-23)

%l

小时 (1-12)

%M

月名

%m

月,数值(00-12)

%p

AM 或 PM

%r

时间,12-小时(hh:mm:ss AM 或 PM)

%S

秒(00-59)

%s

秒(00-59)

%T

时间, 24-小时 (hh:mm:ss)

%U

周 (00-53) 星期日是一周的第一天

%u

周 (00-53) 星期一是一周的第一天

%V

周 (01-53) 星期日是一周的第一天,与 %X 使用

%v

周 (01-53) 星期一是一周的第一天,与 %x 使用

%W

星期名

%w

周的天 (0=星期日, 6=星期六)

%X

年,其中的星期日是周的第一天,4 位,与 %V 使用

%x

年,其中的星期一是周的第一天,4 位,与 %v 使用

%Y

年,4 位

%y

年,2 位

如果想要统计一天之内,按照一定的分钟间隔汇总的数据,用SQL实现,还不知道有什么方便的方式,如果大家有相关的解决方案,可以分享一下。

2017-05-31补充一下支持跨天的按照一定时间间隔统计汇总数量的SQL,例子是按照15分钟汇总统计

select count(1), from_unixtime( round(unix_timestamp(a5_firsttime)/(15*60)) * 15*60) from ccb_alerts where a5_firsttime >= '2017-03-20 00:00:00' group by round(unix_timestamp(a5_firsttime)/(15*60))

日期格式化函数

Mysql日期、时间转换函数:date_format(date, format)、time_format(time,format)能够把一个日期/时间转换成各种各样的字符串。

date_fromat(date, format)

TIMSTAMPADD

按照输入的间隔对日期进行计算。

timestampadd(unit,interval,datetime_expr)

select timestampadd(day, 1, '2008-08-08 08:00:00'); -- 2008-08-09 08:00:00

TIMESTAMPDIFF

Mysql中计算两个日期的时间差函数TIMESTAMPDIFF用法:

语法

TIMESTAMPDIFF(interval,datetime_expr1,datetime_expr2)

说明

返回日期或日期时间表达式datetime_expr1 和datetime_expr2the 之间的整数差。其结果的单位由interval 参数给出。interval 的法定值同TIMESTAMPADD()函数说明中所列出的相同。