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