我提出的问题和图表中的日期和时间是错误的

您正在对日期和时间进行计算,或在图表中显示它们,但是

  • 这些值似乎是错误的,或者
  • 汇总值是错误的。

问题是否由于时区引起?

根本原因:日期和时间使用不同的时区存储,但是对其中一些或所有时区在进行计算时并未考虑(即,问题在于数据不一致)。

采取的步骤

要解决此问题,您需要回答以下问题

  1. 您认为显示不当的数据的正确时区是什么(即,正确答案是什么)?
  2. 每个时间戳上都有明确的时区设置吗,还是有些或所有时间戳在存储时没有时区?例如,Dec 1, 2019 00:00:00Z00 包含时区(显示在 Z 之后),而 Dec 1, 2019 则不包含。
  3. 数据库服务器使用什么时区?
  4. Metabase 使用什么时区?

一旦您有了这些答案,就可以查找以下情况

  1. 您的问题或图表正在比较或排序具有不一致或缺失时区的值。例如,如果航班的出发和到达时间以当地时间报告,则它可能在起飞之前就已到达。
  2. 您的问题正在汇总具有不同时区的时间戳:例如,您网站流量的“每日”总计包含了超过 24 小时的数据,因为您使用的是来自亚洲东部、欧洲和美洲的当地日期。

一旦您认为自己发现了问题,请深入了解具体是哪个时区转换导致了根本问题。例如,假设您正在查看一个包含每日值的时序图;如果您的错误发生在周总数上,您可以

  1. 选择一个您知道数字不正确的特定日期。
  2. 点击图表中的数据点,或结果表中的单元格,然后选择“查看这些 X”。
  3. 在浏览器中另外打开两个标签页,其中包含此问题。更改日期过滤器,使一个标签页显示来自*前一天*的底层表中的行,而另一个标签页显示来自*后一天*的底层表中的行。
  4. 检查用于在底层显示中分组结果的日期字段是否正确。如果它与您存储在数据库中的内容或您在其他工具中的内容不同,则时间戳在各个方面都被错误地转换了。这通常发生在您使用缺少显式时区的值时。
  5. 如果底层时间戳是正确的(如果它们具有显式时区,应该如此),则各个时间可能会被分组到与您想要的不同的时区中的日期。
  6. 要找出它们被转换为哪个时区,请通过将开始时间日期向前或向后移动一小时,直到您获得正确的数字或已后退 12 小时为止,来调整您正在查看的问题上的日期过滤器上的时间。(如果您的任何时区包括印度、纽芬兰或其他有半小时时区差异的司法管辖区,您可能需要以半小时为增量进行此操作。)
  7. 如果这不起作用,请尝试将开始和结束时间向前移动一小时,直到您获得正确的数字或者您向前移动了 12 小时。
  8. 如果此时您已获得正确的值,则表示您的时区已被您手动设置的过滤器向前或向后移动了数小时。如果是这种情况,请检查您得出的偏移量是否与数据仓库的时区或 Metabase 本身的时区匹配。

报告时区设置是否不正确?

根本原因:Metabase 使用的时区与数据仓库使用的时区不匹配,可能导致问题。

采取的步骤

  1. 请检查 报告时区设置,位于管理员设置 > 设置 > 本地化
  2. 如果您使用的是不支持报告时区设置的数据库,请确保 Metabase 的时区与数据库的时区匹配。Metabase 的时区是 Java 虚拟机 (JVM) 的时区,通常通过 -Duser.timezone<..> 参数或 JAVA_TIMEZONE 环境变量设置;具体如何设置取决于您启动 Metabase 的方式。请注意,Metabase 的时区不会影响任何使用报告时区的数据库。

SQL 查询是否未遵守报告时区设置?

根本原因:数据库设置。Metabase 设置了一个会话时区,但某些数据库会忽略它。

采取的步骤

请联系您的数据库管理员,允许设置会话时区。

或者,您也可以在 SQL 查询中显式设置报告时区。

例如,您可以使用 PostgreSQL 编写如下内容

SELECT column::TIMESTAMP AT TIME ZONE 'EST' AS column_est

此语句首先将列转换为 timestamp 数据类型,然后将 timestamp 转换为 timestamptz 数据类型,时区为‘EST’。

没有显式时区的日期是否被转换为另一天?

根本原因:您正在按一个缺少时区的日期(而不是按时间)进行分组。

采取的步骤

  1. 查看您在 数据模型参考 中使用的每个时间字段,看看是否有任何字段只是一个“日期”字段。
  2. 如果是,请确保服务器时区反映报告时区,因为当 Metabase 上运行查询时,服务器会将配置的时区应用于该日期。

您是否混合使用显式和隐式时区?

根本原因:您正在比较或对两个日期进行算术运算,其中一个有显式时区而另一个没有。

采取的步骤

  1. 这通常发生在使用了多个字段的问题中:例如,您正在按一个时间戳过滤,然后按另一个时间戳分组。请检查您问题中使用的每个日期或时间值的时区。
  2. 您需要为任何缺少显式时区的值显式设置时区。这需要通过 SQL 查询来完成,或者通过转换数据库中的数据来确保两个时间戳都有时区。

阅读其他版本的 Metabase 的文档。

这有帮助吗?

感谢您的反馈!
想改进这些文档? 提出更改。
© . This site is unofficial and not affiliated with Metabase, Inc.