SQL按月份分组统计时长求助:基于Unix时间戳的Hours聚合问题
按月份统计时长的SQL问题解决
需求:按月份对Hours(时长)进行分组统计总和。
数据表结构
| id | Date(Unix时间戳) | Hours |
|---|---|---|
| 1 | 1645176391 | 2.1 |
| 1 | 1645435591 | 1.6 |
| 1 | 1642152391 | 1.4 |
| 1 | 1647246391 | 1.7 |
| 2 | 1647246391 | 2.5 |
| 1 | 1647591991 | 0.4 |
当前尝试的SQL代码
SELECT FROM_UNIXTIME(Date, '%m-%Y') AS prod_month, COUNT(Hours) FROM my_table WHERE Date > [最近365天的Unix时间戳] AND id = 1 GROUP BY prod_month;
理想返回结果
| prod_month | Hours |
|---|---|
| 02-2022 | 3.7 |
| 01-2022 | 1.4 |
| 03-2022 | 2.1 |
问题修正与解决方案
当前代码核心问题是用COUNT(Hours)统计记录条数,而你需要的是时长总和,应替换为SUM(Hours);同时可以优化时间条件写法,自动生成最近365天的Unix时间戳,还能按时间排序让结果更规整。
修正后的SQL:
SELECT FROM_UNIXTIME(Date, '%m-%Y') AS prod_month, SUM(Hours) AS Hours FROM my_table WHERE Date > UNIX_TIMESTAMP(NOW() - INTERVAL 365 DAY) AND id = 1 GROUP BY prod_month ORDER BY STR_TO_DATE(prod_month, '%m-%Y');
关键说明
- SUM(Hours):替换COUNT实现时长累加,得到每月总时长。
- UNIX_TIMESTAMP(NOW() - INTERVAL 365 DAY):自动计算最近365天的时间戳,无需手动输入固定值。
- ORDER BY STR_TO_DATE(prod_month, '%m-%Y'):将月份字符串转为日期格式排序,确保结果按时间顺序展示,而非字符串排序。
内容的提问来源于stack exchange,提问作者omand-fl
相关产品推荐
相关产品推荐

