You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

数据库逐小时平均值查询异常:结果全为0求助

解决查询过去24小时每小时temperature2平均值全为0的问题

我来帮你一步步排查这个问题——数据库连接正常但结果全是0,大概率是SQL逻辑、字段数据或者语法细节出了问题,咱们逐个分析:


1. 先排查SQL语句的语法细节

你写的dbname(changed)这里可能有问题,数据库名和表名的正确写法应该是数据库名.表名,如果数据库名包含特殊字符才需要用反引号包裹,比如dbname是正常名称的话,直接写dbname.weather_a就行,括号是多余的,可能会导致语法错误(只是没报错但查询结果异常)。

可以先给SQL加个错误检查,确认语句是否真的执行成功:

$result = mysqli_query($conn, $sql);
if (!$result) {
    die(mysqli_error($conn)); // 直接输出SQL错误信息,快速定位语法问题
}

2. 分组逻辑的歧义问题

你现在SELECT里的date_time是原始字段,但GROUP BY用的是DATE(date_time)和HOUR(date_time),这会导致每个分组只返回该组内第一条数据的date_time,而且分组逻辑不够清晰。

建议用格式化后的整小时时间作为分组依据,同时在查询结果里返回这个标准化的时间,避免歧义:

SELECT 
  DATE_FORMAT(date_time, '%Y-%m-%d %H:00:00') AS hour_time,
  AVG(temperature2) AS avg_temperature2
FROM dbname.weather_a 
WHERE date_time >= NOW() - INTERVAL 1 DAY 
GROUP BY hour_time
ORDER BY hour_time;

3. 时间范围的准确性验证

NOW() - INTERVAL 1 DAY是取当前时间往前推24小时的范围(比如现在是15:20,就是昨天15:20到今天15:20的数据)。如果你需要的是过去24个完整小时(比如昨天15:00到今天14:00),可以调整时间条件:

WHERE date_time >= DATE_FORMAT(NOW(), '%Y-%m-%d %H:00:00') - INTERVAL 24 HOUR

4. 检查temperature2字段的原始数据

如果以上都没问题,那可能是字段本身的数据有问题:

  • 先查询这个时间范围内的原始数据,看看temperature2是不是本身就全是0:
    SELECT temperature2 FROM dbname.weather_a WHERE date_time >= NOW() - INTERVAL 1 DAY LIMIT 20;
    
  • 检查字段数据类型:如果temperature2是整数类型,但实际存储的是小数(比如0.6存入int会变成0),那平均值自然是0,这种情况需要把字段类型改成FLOAT或DECIMAL。

先按这个思路排查,应该能找到问题所在。

内容的提问来源于stack exchange,提问作者Div132

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:25:55