SQL计算电力使用量:平均功率乘当日时长的代码问题求助
问题分析与SQL修正方案
嘿,先理清楚你的核心诉求:你想先算出过去24小时各回路的平均功率,求和得到总平均功率后,再乘以当天00:00到当前时间的小时差,最终得到电力使用量对吧?你的现有SQL有几个关键问题导致没达到预期,我帮你梳理并修正:
现有SQL的核心问题
GROUP BY TS搞砸了平均值计算:
你加了GROUP BY TS,这会让查询返回每一个时间戳(TS)对应的功率值,而变量@APower24Cell这类只能存储最后一行的结果,完全不是你要的「过去24小时整体平均功率」,必须去掉这个分组。当天0点到当前时间的小时差计算错误:
你写的那段复杂的日期转换是错的,正确的当天00:00:00可以用更简洁可靠的方式获取,不用拼接字符串。
修正后的完整SQL代码
-- 先声明所有需要用到的变量,明确类型避免隐式转换问题 DECLARE @APower24Cell FLOAT, @BPower24Cell FLOAT, @CPower24Cell FLOAT DECLARE @APower35Cell FLOAT, @BPower35Cell FLOAT, @CPower35Cell FLOAT DECLARE @FULLPOWER FLOAT DECLARE @TodayMidnight DATETIME = CAST(CAST(GETDATE() AS DATE) AS DATETIME) -- 直接获取当天00:00:00 -- 计算过去24小时各回路的平均功率(去掉GROUP BY TS,求整体平均值) SELECT @APower24Cell = AVG((CAST(ACurrent24Cell AS FLOAT) * CAST(AVoltage3Sec AS FLOAT)) / 10 / 1000), @BPower24Cell = AVG((CAST(BCurrent24Cell AS FLOAT) * CAST(BVoltage3Sec AS FLOAT)) / 10 / 1000), @CPower24Cell = AVG((CAST(CCurrent24Cell AS FLOAT) * CAST(CVoltage3Sec AS FLOAT)) / 10 / 1000), @APower35Cell = AVG((CAST(ACurrent35Cell AS FLOAT) * CAST(AVoltage3Sec AS FLOAT)) / 10 / 1000), @BPower35Cell = AVG((CAST(BCurrent35Cell AS FLOAT) * CAST(BVoltage3Sec AS FLOAT)) / 10 / 1000), @CPower35Cell = AVG((CAST(CCurrent35Cell AS FLOAT) * CAST(CVoltage3Sec AS FLOAT)) / 10 / 1000) FROM Energomonitoring WHERE TS >= DATEADD(HOUR, -24, GETDATE()) -- 计算总电力使用量:总平均功率 × 当天已过小时数 SET @FULLPOWER = (@APower24Cell + @BPower24Cell + @CPower24Cell + @APower35Cell + @BPower35Cell + @CPower35Cell) * DATEDIFF(HOUR, @TodayMidnight, GETDATE()) -- 可选:查看最终计算结果 SELECT @FULLPOWER AS TotalElectricityUsage_KWh
额外优化建议
如果你的表中ACurrent24Cell、AVoltage3Sec这类字段存在NULL值,建议用ISNULL()包裹计算式,避免NULL导致平均值不准确,比如:
@APower24Cell = AVG(ISNULL((CAST(ACurrent24Cell AS FLOAT) * CAST(AVoltage3Sec AS FLOAT)) / 10 / 1000, 0))
这样处理后,就能准确得到你想要的电力使用量结果啦~
内容的提问来源于stack exchange,提问作者gala
相关产品推荐
相关产品推荐

