fix:修改了聚合查询

This commit is contained in:
fengyarnom 2025-05-15 17:20:12 +08:00
parent d35bfb0c18
commit 09c9a078c4

View File

@ -42,67 +42,56 @@ func (dao *SensorDAO) Insert(data *model.SensorData) error {
// 获取聚合数据 // 获取聚合数据
func (dao *SensorDAO) GetAggregatedData(start, end time.Time, interval string) ([]model.AggregatedData, error) { func (dao *SensorDAO) GetAggregatedData(start, end time.Time, interval string) ([]model.AggregatedData, error) {
var query string // 参数化时间间隔
var intervalMinutes int
var timeFormat string
switch interval { switch interval {
case "5min": case "5min":
query = ` intervalMinutes = 5
SELECT timeFormat = "%Y-%m-%dT%H:%i:00"
DATE_FORMAT(
FROM_UNIXTIME(
FLOOR(UNIX_TIMESTAMP(timestamp)/(5*60))*(5*60)
),
'%Y-%m-%dT%H:%i:00'
) as ts,
ROUND(AVG(temperature)/10, 1) as avg_temp,
MAX(rainfall) - MIN(rainfall) as rainfall,
ROUND(AVG(humidity)/10, 1) as avg_humidity,
ROUND(AVG(wind_speed)/10, 1) as avg_wind_speed
FROM sensor_data
WHERE timestamp BETWEEN ? AND ?
GROUP BY FLOOR(UNIX_TIMESTAMP(timestamp)/(5*60))
ORDER BY ts DESC
`
case "30min": case "30min":
query = ` intervalMinutes = 30
SELECT timeFormat = "%Y-%m-%dT%H:%i:00"
DATE_FORMAT(
FROM_UNIXTIME(
FLOOR(UNIX_TIMESTAMP(timestamp)/(30*60))*(30*60)
),
'%Y-%m-%dT%H:%i:00'
) as ts,
ROUND(AVG(temperature)/10, 1) as avg_temp,
MAX(rainfall) - MIN(rainfall) as rainfall,
ROUND(AVG(humidity)/10, 1) as avg_humidity,
ROUND(AVG(wind_speed)/10, 1) as avg_wind_speed
FROM sensor_data
WHERE timestamp BETWEEN ? AND ?
GROUP BY FLOOR(UNIX_TIMESTAMP(timestamp)/(30*60))
ORDER BY ts DESC
`
default: // 1hour default: // 1hour
query = ` intervalMinutes = 60
SELECT timeFormat = "%Y-%m-%dT%H:00:00"
DATE_FORMAT(
FROM_UNIXTIME(
FLOOR(UNIX_TIMESTAMP(timestamp)/3600)*3600
),
'%Y-%m-%dT%H:00:00'
) as ts,
ROUND(AVG(temperature)/10, 1) as avg_temp,
MAX(rainfall) - MIN(rainfall) as rainfall,
ROUND(AVG(humidity)/10, 1) as avg_humidity,
ROUND(AVG(wind_speed)/10, 1) as avg_wind_speed
FROM sensor_data
WHERE timestamp BETWEEN ? AND ?
GROUP BY FLOOR(UNIX_TIMESTAMP(timestamp)/3600)
ORDER BY ts DESC
`
} }
rows, err := dao.db.Query(query, start, end) // 计算秒数
intervalSeconds := intervalMinutes * 60
// 构建通用查询
query := `
SELECT
DATE_FORMAT(
FROM_UNIXTIME(
FLOOR(UNIX_TIMESTAMP(timestamp)/?)*?
),
?
) as ts,
ROUND(AVG(temperature)/10, 1) as avg_temp,
MAX(rainfall) - MIN(rainfall) as rainfall,
ROUND(AVG(humidity)/10, 1) as avg_humidity,
ROUND(AVG(wind_speed)/10, 1) as avg_wind_speed
FROM sensor_data
WHERE timestamp BETWEEN ? AND ?
GROUP BY FLOOR(UNIX_TIMESTAMP(timestamp)/?)
ORDER BY ts DESC
`
// 执行查询
rows, err := dao.db.Query(
query,
intervalSeconds, intervalSeconds, // 用于FROM_UNIXTIME参数
timeFormat, // DATE_FORMAT格式
start, end, // 时间范围
intervalSeconds, // GROUP BY参数
)
if err != nil { if err != nil {
logger.Logger.Printf("查询聚合数据失败: %v", err) logger.Logger.Printf("查询聚合数据失败: %v (间隔=%s, 开始=%s, 结束=%s)",
err, interval, start.Format(time.RFC3339), end.Format(time.RFC3339))
return nil, err return nil, err
} }
defer rows.Close() defer rows.Close()
@ -117,14 +106,23 @@ func (dao *SensorDAO) GetAggregatedData(start, end time.Time, interval string) (
logger.Logger.Printf("扫描数据行失败: %v", err) logger.Logger.Printf("扫描数据行失败: %v", err)
continue continue
} }
// 解析ISO格式的时间字符串 // 解析ISO格式的时间字符串
data.Timestamp, err = time.Parse("2006-01-02T15:04:05", tsStr) data.Timestamp, err = time.Parse("2006-01-02T15:04:05", tsStr)
if err != nil { if err != nil {
logger.Logger.Printf("解析时间失败: %v", err) logger.Logger.Printf("解析时间失败: %v, 原始字符串: %s", err, tsStr)
continue continue
} }
result = append(result, data) result = append(result, data)
} }
// 检查是否有游标错误
if err = rows.Err(); err != nil {
logger.Logger.Printf("查询游标错误: %v", err)
return nil, err
}
logger.Logger.Printf("聚合查询成功: 返回%d条记录 (间隔=%s)", len(result), interval)
return result, nil return result, nil
} }