Grafana从MariaDB获取指定时间范围数据异常的排查求助
家庭自动化数据Grafana查询时区问题排查思路
1. 核对数据源时区配置
- 进入Grafana的MariaDB数据源设置,将数据源时区固定为
UTC(因为你的time列存储的是UTC时间),Grafana全局时区保持browser不变。 - 之前切换数据源时区后出现的问题,大概率是缓存未刷新,保存设置后重新执行查询并刷新图表。
2. 查看Grafana实际发送的SQL语句
- 在查询编辑器右上角点击Query Inspector,直接查看Grafana生成的完整SQL语句,重点看
WHERE子句的时间范围:- 比如选择「最近3小时」时,若本地时区为UTC+2,正确的UTC时间范围应该是
time BETWEEN 'YYYY-MM-DD HH:MM:SS'(本地now-3h转换为UTC) AND 'YYYY-MM-DD HH:MM:SS'(本地now转换为UTC) - 如果生成的时间范围是本地时间而非UTC,说明数据源时区配置错误,导致用本地时间匹配UTC存储的
time列,自然只能拿到部分数据。
- 比如选择「最近3小时」时,若本地时区为UTC+2,正确的UTC时间范围应该是
3. 验证数据库中是否存在目标时间范围的数据
- 直接在MariaDB客户端执行手动查询,确认数据是否存在:
-- 替换为实际的UTC时间范围(本地最近3小时转换为UTC) SELECT time, total_power_1 FROM data WHERE time >= '202X-XX-XX 11:30:00' AND time <= '202X-XX-XX 14:30:00' ORDER BY time;
- 如果该查询能返回3小时的数据,说明Grafana的查询生成逻辑有问题;如果只能返回1小时数据,说明数据写入时未正确转换为UTC,而是直接写入了本地时间。
4. 手动修正SQL查询的时区处理
- 若数据源时区配置无效,可在SQL中显式处理时区转换,确保查询条件使用UTC时间:
SELECT -- 将UTC时间转换为柏林时区(自动适配夏令时) CONVERT_TZ(time, '+00:00', 'Europe/Berlin') AS "time", total_power_1 AS "WP" FROM data WHERE -- $__timeFrom()和$__timeTo()会根据数据源时区生成UTC时间范围 time >= $__timeFrom() AND time <= $__timeTo() ORDER BY time;
5. 确认数据写入逻辑的正确性
- 检查数据写入代码,确认
time列确实被转换为UTC后再存入数据库:- 比如本地时间13:30(UTC+2)写入时,数据库
time列应该是11:30(UTC) - 若写入的是本地时间,会导致Grafana查询UTC时间范围时,只能匹配到对应本地时间的后半段数据,出现图表空白。
- 比如本地时间13:30(UTC+2)写入时,数据库
内容的提问来源于stack exchange,提问作者mcenno
相关产品推荐
相关产品推荐

