我的问题和图表中的日期和时间有误

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

  • 值显示错误,或
  • 汇总值错误。

问题是时区造成的吗?

根本原因: 日期和时间使用不同的时区存储,但在进行计算时没有考虑这些时区中的部分或全部时区(即问题是数据不一致)。

采取的步骤

要解决这个问题,您需要回答以下问题:

  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 虚拟机时区,通常通过 -Duser.timezone<..> 参数或 JAVA_TIMEZONE 环境变量设置;具体设置方式取决于您如何启动 Metabase。请注意,Metabase 的时区不会影响使用报告时区的任何数据库。

SQL 查询不遵守报告时区设置吗?

根本原因: 我们目前不对 SQL 查询的结果应用报告时区。

采取的步骤

在您的 SQL 查询中明确设置报告时区。

例如,您可以使用 PostgreSQL 编写如下语句:

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

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

没有明确时区的日期会被转换为另一天吗?

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

采取的步骤

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

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

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

采取的步骤

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

阅读 Metabase 其他版本的文档。

© . All rights reserved.