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'))

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