我的问题和图表中的日期和时间不正确

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

  • 值似乎不正确,或者
  • 汇总值不正确。

问题是否是由于时区引起的?

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

要采取的步骤

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

  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 查询是否不遵守报告时区设置?

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

要采取的步骤

在您的 SQL 查询中显式设置报告时区。

例如,您可以使用 PostgreSQL 编写类似这样的内容

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

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

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

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

要采取的步骤

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

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

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

要采取的步骤

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

阅读其他Metabase 版本的文档。