mysql每隔俩小时、四小时、八小时进行数据统计

mysql每隔俩小时、四小时、八小时进行数据统计

  1. 需求:我们经常会遇到每隔一分钟、一小时、一天、一个月进行数据统计,遇到如标题所说的统计信息比较少见,在遇到一些坑之后,解决了问题,先上坑:

    • HOUR % 时间间隔: 这种只能取出 余数为0 的那个时间的思路。
  2. 解决思路(每隔两小时进行统计):
    先处理HOUR,得到数据之后,在求和:

  3. 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

  1. 重点是这段语句:
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' )  ) 
  1. 更需要注意的是,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'))

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章