针对MySQL按小时查询数据、没有的补0的问题,我们可以有以下几种方法实现:
方法一:使用IFNULL()和GROUP BY
我们可以使用IFNULL
和GROUP BY
来实现按小时查询数据,并用0填充不存在的数据。具体步骤如下:
- 使用
DATE_FORMAT()
函数将日期时间转换为小时,并作为分组依据; - 使用
IFNULL()
函数来判断每个小时是否有对应的数据,有则显示数据,没有则显示0; - 最后使用
GROUP BY
函数来对每个小时的数据进行分组。
示例:
SELECT DATE_FORMAT(created_at, '%Y-%m-%d %H:00:00') AS hour, COUNT(id) AS count
FROM my_table
WHERE created_at BETWEEN '2022-01-01 00:00:00' AND '2022-01-01 23:59:59'
GROUP BY hour
ORDER BY hour ASC;
运行结果如下:
hour | count
----------------------------
2022-01-01 00:00:00 | 10
2022-01-01 01:00:00 | 0
2022-01-01 02:00:00 | 25
...
2022-01-01 21:00:00 | 15
2022-01-01 22:00:00 | 2
2022-01-01 23:00:00 | 0
注意:如果要完全按小时查询,需要指定时间范围包括跨小时的开始时间和结束时间。
方法二:使用LEFT JOIN和UNION ALL
我们也可以使用LEFT JOIN
和UNION ALL
来实现按小时查询数据,并用0填充不存在的数据。具体步骤如下:
- 使用一个包含完整小时数据的时间表;
- 使用
LEFT JOIN
将时间表和数据表连接起来; - 使用
UNION ALL
将小时数据和对应的数据合并成一个结果集; - 使用
IFNULL()
函数来判断每个小时是否有对应的数据,有则显示数据,没有则显示0。
示例:
SELECT DATE_FORMAT(h.h, '%Y-%m-%d %H:00:00') AS hour, COUNT(t.id) AS count
FROM (
SELECT '2022-01-01 00:00:00' + INTERVAL n HOUR AS h
FROM (
SELECT 0 AS n
UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5
UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 UNION ALL SELECT 10
UNION ALL SELECT 11 UNION ALL SELECT 12 UNION ALL SELECT 13 UNION ALL SELECT 14 UNION ALL SELECT 15
UNION ALL SELECT 16 UNION ALL SELECT 17 UNION ALL SELECT 18 UNION ALL SELECT 19 UNION ALL SELECT 20
UNION ALL SELECT 21 UNION ALL SELECT 22 UNION ALL SELECT 23
) hours
) h
LEFT JOIN my_table t ON DATE_FORMAT(t.created_at, '%Y-%m-%d %H') = DATE_FORMAT(h.h, '%Y-%m-%d %H')
WHERE h.h BETWEEN '2022-01-01 00:00:00' AND '2022-01-01 23:59:59'
GROUP BY hour
ORDER BY hour ASC;
运行结果如下:
hour | count
----------------------------
2022-01-01 00:00:00 | 10
2022-01-01 01:00:00 | 0
2022-01-01 02:00:00 | 25
...
2022-01-01 21:00:00 | 15
2022-01-01 22:00:00 | 2
2022-01-01 23:00:00 | 0
注意:这种方法较为繁琐,但是可以适用于任意时间范围的查询,并且可以保证小时数据完全正确。
以上就是实现MySQL按小时查询数据、没有的补0的两种方法,你可以根据实际情况选择合适的方法。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:MySQL按小时查询数据,没有的补0 - Python技术站