【问题标题】:Grafana receives epoch timestamp 1 hour ahead from SQL ServerGrafana 提前 1 小时从 SQL Server 接收纪元时间戳
【发布时间】:2022-01-28 07:40:44
【问题描述】:

数据源是 SQL Server 2014(只读)。 Grafana v8.2.1.

列是changeDate datetime2(7)。 我正在使用在 CET 中配置的 DBeaver(我在 UTC+1 时区),它显示: 活动实际UTC时间:2022-01-27 12:47:09

单元格值:2022-01-27 13:47:09(CET,UTC +1)

2022-01-27T12:47:09.784Z(值显示为 ISO8601 格式的源代码,因此为 UTC)

一切似乎都很好,现在是实际时间。然后我检查在 CET (UTC +1) 时区配置的 Grafana 中接收到的数据。

(原始数据)1643291229000 或 GMT(UTC):2022-01-27 13:47:09(+1 小时班次)

显示为 UTC + 1:2022-01-27 14:47:09

您可以看到 Epoch 时间戳提前 1 小时。

我的查询很简单:SELECT changeDate as time (...) 我无法在 SQL Server 2014 中使用 AT TIME ZONE

我将非常感谢任何帮助。

【问题讨论】:

  • 不,不是提前 1 小时。这正是 13:47 UTC 对 UTC+1 的看法。无论如何,转换是由 Grafana 执行的,而不是 SQL Server。如果您关心偏移量,您应该使用datetimeoffset,但在这种情况下,所有正确配置的应用程序都会同时显示
  • SQL Server 或 JSON 无论如何都不处理 UNIX 时间戳。几乎所有主要数据库(SQLite 除外)都有适当的日期类型。在 JSON 中,实际的日期文字标准是 ISO8601 格式。实际的存储格式应该无关紧要,并且很可能 与 Unix 时间戳相同。
  • @PanagiotisKanavos 那么,数据存储在UTC还是UTC+1?为什么如果我将数据库值显示为源代码/json 它是 2022-01-27T12:47:09.784Z(我猜这是 UTC)?
  • 你告诉我们。您是存储数据的人。如果没有 datetimeoffset 中的偏移量,您只能假设日期存储为 UTC。您所描述的建议日期存储为 UTC 并正确显示为 UTC+1。 UTC 表示+00:00 的偏移量。 UTC+1 表示+01:00 的偏移量。时间13:00+0014:00 +01:00
  • 真正的问题是什么?既然您将 Grafana 配置为显示 CET 时间,为什么要期待不同的英国冬季时间?伦敦的中午 12 点是维也纳的 13:00。如果您将值存储为 12pm London,则每个配置为显示维也纳时间的应用程序都将显示 13:00

标签: sql-server datetime sql-server-2014 grafana


【解决方案1】:

我试图用这个查询来修复它,但这不是最时尚的解决方案。

DECLARE @offset int = datediff(hour, getutcdate(), getdate());
SELECT
  DATEADD(hour, - @offset, changeDate) as time,
  column2 as value
FROM
  tablename
WHERE
  changeDate BETWEEN  DATEADD(hour, @offset, CAST($__timeFrom() AS DATETIME2)) AND DATEADD(hour, @offset, CAST($__timeTo() AS DATETIME2))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-19
    • 2017-12-14
    • 2014-09-13
    • 1970-01-01
    • 1970-01-01
    • 2014-09-13
    • 2012-03-10
    • 1970-01-01
    相关资源
    最近更新 更多