如何统计不同时间段的数量?
摘要:数据库存放数据如下: SELECT t.start_time,t.end_time FROM vipsoft_order t MySQL SELECT CONCAT(LPAD(hour_range, 2, '0&am
数据库存放数据如下:
SELECT t.start_time,t.end_time FROM vipsoft_order t
MySQL
SELECT
CONCAT(LPAD(hour_range, 2, '0'), ':00~', LPAD(hour_range + 1, 2, '0'), ':00') as time_period,
SUM(CASE WHEN HOUR(start_time) = hour_range THEN 1 ELSE 0 END) as start_count,
SUM(CASE WHEN HOUR(end_time) = hour_range THEN 1 ELSE 0 END) as end_count
FROM
vipsoft_order,
(SELECT 0 as hour_range UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4
UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
UNION SELECT 10 UNION SELECT 11 UNION SELECT 12 UNION SELECT 13 UNION SELECT 14
UNION SELECT 15 UNION SELECT 16 UNION SELECT 17 UNION SELECT 18 UNION SELECT 19
UNION SELECT 20 UNION SELECT 21 UNION SELECT 22 UNION SELECT 23) hours
GROUP BY
hour_range
ORDER BY
hour_range;
PostgreSQL版本
SELECT
TO_CHAR(hour_range, '00') || ':00~' || TO_CHAR(hour_range + 1, '00') || ':00' as time_period,
COUNT(CASE WHEN EXTRACT(HOUR FROM start_time) = hour_range THEN 1 END) as start_count,
COUNT(CASE WHEN EXTRACT(HOUR FROM end_time) = hour_range THEN 1 END) as end_count
FROM
generate_series(0, 23) as hour_range
LEFT JOIN
custody_order ON EXTRACT(HOUR FROM start_time) = hour_range OR EXTRACT(HOUR FROM end_time) = hour_range
GROUP BY
hour_range
ORDER BY
hour_range;
关键点说明:
小时范围生成:创建0-23的小时序列
时间格式化:将小时格式化为08:00~09:00的格式
计数逻辑:
start_count:统计start_time小时等于当前时段的记录
end_count:统计end_time小时等于当前时段的记录
处理NULL值:使用LEFT JOIN确保即使某个时段没有数据也会显示0
这样您就能得到按小时分组的开始和结束数量统计了。
Mybatis 不建实体类,将数据反给前端: https://www.cnblogs.com/vipsoft/p/19195490
