From d133eedd06aecc61c23dad0aa8f8bbeec21ae635 Mon Sep 17 00:00:00 2001 From: fengyarnom Date: Thu, 15 May 2025 17:36:30 +0800 Subject: [PATCH] =?UTF-8?q?fix=EF=BC=9A=E4=BF=AE=E6=94=B9=E4=BA=86?= =?UTF-8?q?=E8=81=9A=E5=90=88=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/dao/sensor.go | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/internal/dao/sensor.go b/internal/dao/sensor.go index 93305e2..77d3cf3 100644 --- a/internal/dao/sensor.go +++ b/internal/dao/sensor.go @@ -54,12 +54,13 @@ func (dao *SensorDAO) GetAggregatedData(start, end time.Time, interval string) ( intervalMinutes = 60 } - // 使用子查询和时间桶来实现聚合 + // 使用更基本的SQL函数来实现聚合 query := ` SELECT - DATE_FORMAT( - DATE_SUB(timestamp, INTERVAL MOD(MINUTE(timestamp), ?) MINUTE), - '%Y-%m-%dT%H:%i:00' + CONCAT( + DATE_FORMAT(timestamp, '%Y-%m-%d'), 'T', + HOUR(timestamp), ':', + FLOOR(MINUTE(timestamp) / ?) * ?, ':00' ) AS bucket_time, ROUND(AVG(temperature)/10, 1) AS avg_temp, MAX(rainfall) - MIN(rainfall) AS rainfall, @@ -67,15 +68,19 @@ func (dao *SensorDAO) GetAggregatedData(start, end time.Time, interval string) ( ROUND(AVG(wind_speed)/10, 1) AS avg_wind_speed FROM sensor_data WHERE timestamp BETWEEN ? AND ? - GROUP BY bucket_time + GROUP BY + DATE(timestamp), + HOUR(timestamp), + FLOOR(MINUTE(timestamp) / ?) ORDER BY bucket_time DESC ` // 执行查询 rows, err := dao.db.Query( query, - intervalMinutes, // 时间桶参数 - start, end // 时间范围 + intervalMinutes, intervalMinutes, // 时间桶计算参数 + start, end, // 时间范围 + intervalMinutes // GROUP BY参数 ) if err != nil { @@ -97,7 +102,7 @@ func (dao *SensorDAO) GetAggregatedData(start, end time.Time, interval string) ( } // 解析ISO格式的时间字符串 - data.Timestamp, err = time.Parse("2006-01-02T15:04:05", tsStr) + data.Timestamp, err = time.Parse("2006-01-02T15:04:00", tsStr) if err != nil { logger.Logger.Printf("解析时间失败: %v, 原始字符串: %s", err, tsStr) continue