如何从MySQL提取间隔为分钟/小时的tagid=1186传感器时间戳数据?
按分钟/小时间隔提取传感器数据的MySQL方案
你的t_stamp字段是毫秒级时间戳,数据库每10秒存储一条tagid=1186的记录,以下是两种常见的提取方案:
一、按分钟间隔提取
1. 抽取每分钟的第一条数据
SELECT MIN(t_stamp) AS minute_start, floatvalue FROM database1.sqlt_data_1_2022_01 WHERE tagid=1186 GROUP BY FLOOR(t_stamp / (1000 * 60));
- 逻辑:
FLOOR(t_stamp / (1000 * 60))将毫秒时间戳转换为分钟级分组标识,每组对应一分钟;MIN(t_stamp)取该分钟内最早的记录时间戳,同时获取对应的传感器数值。
2. 抽取每分钟的最后一条数据
SELECT MAX(t_stamp) AS minute_end, floatvalue FROM database1.sqlt_data_1_2022_01 WHERE tagid=1186 GROUP BY FLOOR(t_stamp / (1000 * 60));
- 逻辑:用
MAX(t_stamp)取该分钟内最晚的记录时间戳,对应获取传感器数值。
3. 对每分钟数据做聚合计算(如平均值、最大值)
如果需要统计每分钟的传感器数据特征,可使用聚合函数:
SELECT FROM_UNIXTIME(FLOOR(t_stamp / 1000) DIV 60 * 60) AS minute_time, -- 转换为可读的分钟起始时间 AVG(floatvalue) AS avg_value, MAX(floatvalue) AS max_value, MIN(floatvalue) AS min_value FROM database1.sqlt_data_1_2022_01 WHERE tagid=1186 GROUP BY FLOOR(t_stamp / (1000 * 60));
- 逻辑:
FROM_UNIXTIME(...)将分组后的时间戳转换为YYYY-MM-DD HH:MM:00格式的可读时间,聚合函数计算该分钟内数据的统计值。
二、按小时间隔提取
和分钟逻辑一致,仅将分组粒度改为3600秒(1小时):
1. 抽取每小时的第一条数据
SELECT MIN(t_stamp) AS hour_start, floatvalue FROM database1.sqlt_data_1_2022_01 WHERE tagid=1186 GROUP BY FLOOR(t_stamp / (1000 * 3600));
2. 抽取每小时的最后一条数据
SELECT MAX(t_stamp) AS hour_end, floatvalue FROM database1.sqlt_data_1_2022_01 WHERE tagid=1186 GROUP BY FLOOR(t_stamp / (1000 * 3600));
3. 对每小时数据做聚合计算
SELECT FROM_UNIXTIME(FLOOR(t_stamp / 1000) DIV 3600 * 3600) AS hour_time, -- 转换为可读的小时起始时间 AVG(floatvalue) AS avg_value, MAX(floatvalue) AS max_value, MIN(floatvalue) AS min_value FROM database1.sqlt_data_1_2022_01 WHERE tagid=1186 GROUP BY FLOOR(t_stamp / (1000 * 3600));
补充说明
- 若
t_stamp是datetime类型而非时间戳,分组逻辑可改为DATE_FORMAT(t_stamp, '%Y-%m-%d %H:00:00')(小时级)或DATE_FORMAT(t_stamp, '%Y-%m-%d %H:%i:00')(分钟级)。 FROM_UNIXTIME函数可将时间戳转换为标准日期时间格式,方便后续数据查看与分析。
内容的提问来源于stack exchange,提问作者Edwin Gavilan
相关产品推荐
相关产品推荐

