
本文介绍如何通过SQL将时间戳按每小时区间(如“10-11”“11-12”)分组并统计出现次数,生成形如 的键值映射结果,适用于日志分析、访问量统计等场景。
本文介绍如何通过sql将时间戳按每小时区间(如“10-11”“11-12”)分组并统计出现次数,生成形如 `` 的键值映射结果,适用于日志分析、访问量统计等场景。
在实际数据分析中,我们常需将精确到秒或分钟的时间戳聚合为更易读的小时区间(例如 10-11 表示从当天 10:00:00 到 10:59:59 的所有记录),而非简单按小时整点(HOUR())分组。关键在于:小时区间的起始标识应为该小时内任意时间的 HOUR() 值,终点为 HOUR() + 1,且需确保同一区间内所有记录被归入一个逻辑桶中。
以下 SQL 查询可精准实现该需求:
SELECT CONCAT(HOUR(date_time), '-', HOUR(date_time) + 1) AS hour_range, COUNT(*) AS count FROM your_table GROUP BY HOUR(date_time) ORDER BY HOUR(date_time);
✅ 说明与要点:
-
HOUR(date_time)提取时间戳的小时部分(0–23),作为区间左边界; -
CONCAT(HOUR(...), '-', HOUR(...) + 1)构造如"10-11"的字符串键,语义清晰; -
GROUP BY HOUR(date_time)是核心——它天然将10:05、10:47、10:59等全部归入10组,再统一映射为"10-11"; -
ORDER BY HOUR(date_time)保证结果按时间顺序排列,便于后续处理或展示。
⚠️ 注意事项:
- 此方案不跨日期聚合(即
2023-07-18 23:50和2023-07-19 00:15不会混入同一区间),符合常规业务逻辑; - 若需支持多日数据并保留日期维度(如
"2023-07-18_10-11"),可扩展为GROUP BY DATE(date_time), HOUR(date_time)并调整CONCAT; - 字段名
date_time需替换为你的实际列名(如created_at,event_time); - 该查询兼容 MySQL 5.7+ 及 MariaDB;若使用 PostgreSQL 或 SQL Server,需改用对应的时间函数(如
EXTRACT(HOUR FROM date_time))。
? 进阶建议:
如需输出标准 Java Map<string integer></string> 结构,可在应用层执行查询后构造(例如 Spring JDBC Template 返回 List<map object>></map> 后转为 HashMap);若必须数据库侧生成 JSON 格式,MySQL 5.7+ 可结合 JSON_OBJECTAGG 实现,但通常推荐由业务代码完成最终结构化封装。
综上,本方法简洁、高效、可读性强,是小时级时间区间统计的通用实践方案。










