如何用SQL对每秒DateTime数据计算每小时平均值?
按小时统计Value平均值的SQL实现方案
没问题,我来帮你搞定这个按小时统计平均值的需求~核心思路是把每秒的时间戳截断到小时级别,然后按这个截断后的时间分组,计算对应时段的Value平均值。下面针对不同主流数据库给出具体实现:
1. MySQL/MariaDB
方案一(MySQL 8.0+ 推荐)
用DATE_TRUNC函数直接截断时间到小时:
SELECT DATE_TRUNC('hour', oDateTime) AS oDateTime, AVG(Value) AS Value FROM your_table_name GROUP BY DATE_TRUNC('hour', oDateTime) ORDER BY oDateTime;
方案二(兼容旧版MySQL)
用DATE_FORMAT格式化时间为小时起始点:
SELECT DATE_FORMAT(oDateTime, '%Y-%m-%d %H:00:00') AS oDateTime, AVG(Value) AS Value FROM your_table_name GROUP BY DATE_FORMAT(oDateTime, '%Y-%m-%d %H:00:00') ORDER BY oDateTime;
2. SQL Server
方案一(SQL Server 2022+ 推荐)
支持DATE_TRUNC函数:
SELECT DATE_TRUNC(hour, oDateTime) AS oDateTime, AVG(Value) AS Value FROM your_table_name GROUP BY DATE_TRUNC(hour, oDateTime) ORDER BY oDateTime;
方案二(兼容旧版SQL Server)
用DATEADD+DATEDIFF组合截断时间:
SELECT DATEADD(hour, DATEDIFF(hour, 0, oDateTime), 0) AS oDateTime, AVG(Value) AS Value FROM your_table_name GROUP BY DATEADD(hour, DATEDIFF(hour, 0, oDateTime), 0) ORDER BY oDateTime;
3. PostgreSQL
直接使用DATE_TRUNC函数即可:
SELECT DATE_TRUNC('hour', oDateTime) AS oDateTime, AVG(Value) AS Value FROM your_table_name GROUP BY DATE_TRUNC('hour', oDateTime) ORDER BY oDateTime;
关键说明
DATE_TRUNC(或格式化函数)的作用是把任意秒级时间戳转换为对应小时的起始时间(比如2017-01-01 00:05:30会变成2017-01-01 00:00:00),这样同一小时内的所有记录会被归为一组。AVG(Value)负责计算该小时内所有Value的平均值。- 最后加上
ORDER BY oDateTime可以保证结果按时间顺序排列,方便查看。 - 如果只需要统计特定日期的数据,可以在
FROM后加WHERE子句,比如WHERE oDateTime >= '2017-01-01' AND oDateTime < '2017-01-02'。
内容的提问来源于stack exchange,提问作者Haminteu
相关产品推荐
相关产品推荐

