MySql中每隔3小时统计数据,sql如下:
SELECT NAME, IFNULL(count + count1, 0) AS `count`
FROM (
SELECT t1.NAME, t.count, t1.count1
FROM (
SELECT CASE
WHEN HOUR(start_time) BETWEEN 0 AND 3 THEN '00'
WHEN HOUR(start_time) BETWEEN 3 AND 6 THEN '03'
WHEN HOUR(start_time) BETWEEN 6 AND 9 THEN '06'
WHEN HOUR(start_time) BETWEEN 9 AND 12 THEN '09'
WHEN HOUR(start_time) BETWEEN 12 AND 15 THEN '12'
WHEN HOUR(start_time) BETWEEN 15 AND 18 THEN '15'
WHEN HOUR(start_time) BETWEEN 18 AND 21 THEN '18'
WHEN HOUR(start_time) BETWEEN 21 AND 23 THEN '21'
END AS `name`, IFNULL(COUNT(1), 0) AS `count`
FROM 表名
WHERE 1 = 1
and start_time >= '2020-10-11 00:00:00' AND start_time < '2020-10-12 00:00:00'
GROUP BY CASE
WHEN HOUR(start_time) BETWEEN 0 AND 3 THEN 1
WHEN HOUR(start_time) BETWEEN 3 AND 6 THEN 2
WHEN HOUR(start_time) BETWEEN 6 AND 9 THEN 3
WHEN HOUR(start_time) BETWEEN 9 AND 12 THEN 4
WHEN HOUR(start_time) BETWEEN 12 AND 15 THEN 5
WHEN HOUR(start_time) BETWEEN 15 AND 18 THEN 6
WHEN HOUR(start_time) BETWEEN 18 AND 21 THEN 7
WHEN HOUR(start_time) BETWEEN 21 AND 23 THEN 8
END
) t
RIGHT JOIN (
SELECT '00' AS NAME, 0 AS count1
UNION
SELECT '03' AS NAME, 0 AS count1
UNION
SELECT '06' AS NAME, 0 AS count1
UNION
SELECT '09' AS NAME, 0 AS count1
UNION
SELECT '12' AS NAME, 0 AS count1
UNION
SELECT '15' AS NAME, 0 AS count1
UNION
SELECT '18' AS NAME, 0 AS count1
UNION
SELECT '21' AS NAME, 0 AS count1
) t1
ON t.NAME = t1.NAME
) t
注意:
AND to_Days(start_time) = to_days(now()) 这里不建议这么写,有to_days()这种运算的逻辑没必要在数据库中去做运算