mysql每隔俩小时、四小时、八小时进行数据统计
-
需求:我们经常会遇到每隔一分钟、一小时、一天、一个月进行数据统计,遇到如标题所说的统计信息比较少见,在遇到一些坑之后,解决了问题,先上坑:
- HOUR % 时间间隔: 这种只能取出 余数为0 的那个时间的思路。
-
解决思路(每隔两小时进行统计):
先处理HOUR,得到数据之后,在求和: -
sql语句:
SELECT
DATE_FORMAT(
concat(
date( time ),
' ',
FLOOR( HOUR ( time ) / 2 ) * 2
),
'%Y-%m-%d %H:%00:00'
) AS time,
`msg`.`status`,
`msg_b`.`name`,
COUNT( `msg`.`status` ) AS `status__count`
FROM
msg INNER JOIN `msg_b` ON ( `msg`.`operator_name` = `msg_b`.`smpp_cid` )
WHERE
( `msg`.`status` IN ( 1, 2 ) AND `msg`.time >= '2019-11-01 13 : 43 : 22.506465' AND `msg`.time <= '2019-11-29 13 : 43 : 22.506482' )
GROUP BY
`msg`.`status`,
`msg_b`.`name`,
(DATE_FORMAT( CONCAT( DATE( time ), ' ', FLOOR( HOUR ( time ) / 2 ) * 2 ), '%Y-%m-%d %H:00:00' ) )
ORDER BY
time
- 重点是这段语句:
DATE_FORMAT(
concat(
date( time ),
' ',
FLOOR( HOUR ( time ) / 2 ) * 2
),
'%Y-%m-%d %H:%00:00'
) AS time
和
GROUP BY
`msg`.`status`,
`msg_b`.`name`,
(DATE_FORMAT( CONCAT( DATE( time ), ' ', FLOOR( HOUR ( time ) / 2 ) * 2 ), '%Y-%m-%d %H:00:00' ) )
- 更需要注意的是,group by的date格式要和select中的保持一致,不然出来的日期会有重复!也就达不到分组统计的效果了,最后,献上django的orm写法:
base_queryset.extra(select={
"time": "DATE_FORMAT(CONCAT(DATE( time ),' ',FLOOR( HOUR ( time ) / 2 ) * 2),'%%Y-%%m-%%d %%H:00:00')"}).values(
'field1', 'field2', 'time').annotate(models.Count('status'))