我的问题和图表中的日期和时间有误
您正在使用日期和时间进行计算或在图表中显示它们,但
- 值似乎有误,或者
- 汇总值有误。
问题是否与时区有关?
根本原因:日期和时间使用不同的时区存储,但在进行计算时并未考虑其中一些或所有时区(即,问题在于数据不一致)。
采取的步骤
要解决此问题,您需要回答以下问题:
- 您认为显示不正确的数据的正确时区是什么(即,正确的答案是什么)?
- 每个时间戳都有明确的时区设置吗,还是有些或所有时间戳在存储时没有时区?例如,
2019 年 12 月 1 日 00:00:00Z00
包含时区(在Z
之后显示),但2019 年 12 月 1 日
不包含。 - 数据库服务器使用的是哪个时区?
- Metabase 使用的是哪个时区?
有了这些答案后,请查找以下情况:
- 您的问题或图表正在比较或排序具有不一致或缺失时区的值。例如,如果航班的起降时间以当地时间报告,它可能在起飞前就已到达。
- 您的问题正在聚合具有不同时区的时间戳:例如,您网站流量的“每日”总数包含超过 24 小时的数据,因为您使用的是东亚、欧洲和美洲的本地日期。
一旦您认为已经发现问题,请深入了解究竟是哪种时区转换导致了根本问题。例如,假设您正在查看具有每日值的时间序列;如果您的错误发生在每周总计中,您可以
- 选择一个您知道数字不正确的特定日期。
- 单击图表中的数据点或结果表中的单元格,然后选择“查看这些 X”。
- 在浏览器的另外两个选项卡中打开此问题。更改日期过滤器,使一个选项卡包含基础表中前一天的行,另一个选项卡包含基础表中后一天的行。
- 检查用于在基础显示中对结果进行分组的日期字段是否正确。如果它与您存储在数据库中或在其他工具中的内容不同,则时间戳在所有方面都转换不正确。当您使用缺少明确时区的日期或时间时,通常会发生这种情况。
- 如果基础时间戳正确(如果它们有明确的时区,则应该如此),则各个时间可能以与您想要的不同的时区分组到日期中。
- 要找出它们正在转换为哪个时区,请通过将开始时间和开始日期向前或向后移动一小时来调整您正在查看的问题上的日期过滤器,直到您获得正确的数字或您已经回溯了 12 小时。(如果您的任何时区包含印度、纽芬兰或其他具有半小时时区的管辖区,您可能需要以半小时为增量进行此操作。)
- 如果这不起作用,请尝试将开始时间和结束时间向前移动一小时,直到您获得正确的数字或您已经前进了 12 小时。
- 如果此时您获得了正确的值,这意味着您的时区已通过您手动设置过滤器向前或向后的小时数进行了转换。如果是这种情况,请检查您得出的偏移量是否与数据仓库的时区或 Metabase 本身的时区匹配。
报告时区设置是否不正确?
根本原因:问题或图表中的错误数字可能是由于 Metabase 使用的时区与数据仓库使用的时区不匹配造成的。
采取的步骤
- 从管理员设置 > 设置 > 本地化中检查报告时区设置。
- 如果您使用的是不支持报告时区设置的数据库,请确保 Metabase 的时区与数据库的时区匹配。Metabase 的时区是 Java 虚拟机(Java Virtual Machine)的时区,通常通过
-Duser.timezone<..>
参数或JAVA_TIMEZONE
环境变量设置;具体设置方式取决于您启动 Metabase 的方式。请注意,Metabase 的时区不会影响任何使用报告时区的数据库。
SQL 查询是否未遵守报告时区设置?
根本原因:数据库设置。Metabase 设置了会话时区,但某些数据库会忽略它。
采取的步骤
联系您的数据库管理员,允许设置会话时区。
或者,您也可以在 SQL 查询中明确设置报告时区。
例如,您可以使用 PostgreSQL 编写如下内容:
SELECT column::TIMESTAMP AT TIME ZONE 'EST' AS column_est
此语句首先将列转换为 timestamp
数据类型,然后将 timestamp
转换为 timestamptz
数据类型,时区为“EST”。
没有明确时区的日期是否正在转换为另一天?
根本原因:您正在按缺少时区的日期(而不是按时间)进行分组。
采取的步骤
- 查看您问题中使用的数据模型参考中的每个时间字段,并查看其中是否有任何只是“日期”字段。
- 如果是这样,请确保服务器时区反映了报告时区,因为当在 Metabase 上运行查询时,服务器会将配置的时区应用于该日期。
您是否混合使用显式和隐式时区?
根本原因:您正在比较或对两个日期进行算术运算,其中一个具有显式时区,而另一个没有。
采取的步骤
- 这通常发生在使用了多个字段的问题中:例如,您正在筛选一个时间戳并按另一个时间戳分组。检查您问题中使用的每个日期或时间段的时区。
- 您需要为任何缺少明确时区的值明确设置时区。这需要在 SQL 查询中完成,或者通过转换数据库中的数据来确保两个时间戳都具有时区。
阅读其他版本的 Metabase 的文档。