数据库逐小时平均值查询异常:结果全为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
相关产品推荐
相关产品推荐

