Grafana在使用Mysql数据源时,发现显示时间比正常时间多8小时。
我们可以在查询中将时间改成 UNIX_TIMESTAMP(your_date) AS "time",或者将时区改成UTC+00:00就可以解决了,但这样会导致你查询时间跟你的实际时间有时差,治标不治本。所以还是建议使用UNIX_TIMESTAMP(your_date) AS "time"
SELECT
UNIX_TIMESTAMP(ts.time_point) AS 'time',
ma.MeterAdd AS '地址'
from loadcurvedata
WHERE
$__timeFilter(ts.time_point)
✅ 为什么时差是个问题?
在数据库中,create_date
往往是 带时区的本地时间(比如北京时间),而:
-
Grafana 的时间处理是基于 UTC 的(协调世界时);
-
如果直接传字符串时间(如
'2025-04-14 10:00:00'
),Grafana 会认为它是 UTC; -
这就会导致显示结果有 8小时的误差(中国比 UTC 快 8 小时)。
✅ 为什么用 UNIX_TIMESTAMP()
能避免时差?
-
UNIX_TIMESTAMP(create_date)
会把create_date
转换为一个 整数时间戳,单位是秒; -
时间戳是一个 全球统一标准,从 1970年1月1日 UTC 零点开始计算;
-
Grafana 内部处理时间戳时就不会再发生“我以为你是UTC但你其实是东八区”的问题了。
换句话说:
✅ 时间戳 = 消除了“本地时间 vs UTC”的歧义
✅ 为什么字段必须叫 "time"
?
Grafana 有一个约定俗成的要求:
🔹 在 SQL 查询中,字段名为
"time"
的列,会被 Grafana 自动识别为时间戳字段,用于绘制时间轴。
如果你不把时间字段命名为 "time"
,Grafana 就 无法识别哪个字段是时间维度,你的图表可能就会报错或者不显示数据。如果你是做表格展示(Table Panel),时间字段其实可以不是 "time"
,但是你叫 "time"
可以避免时差问题。