ConvertTimezone
convertTimezone
通过向时间戳添加或减去正确的时间间隔,将时间戳转换到指定时区。
语法 | 示例 |
---|---|
convertTimezone(列, 目标, 来源) |
convertTimezone("2022-12-28T12:00:00", "Canada/Pacific", "Canada/Eastern") |
将时间戳从源时区转换到目标时区。 | 返回值为 2022-12-28T09:00:00 ,显示为 2022 年 12 月 28 日 9:00 AM |
时间戳和时区处理起来相当棘手(很容易出错,也很难发现错误),因此您只应在数据解释对基于时间的截止日期敏感时才尝试使用 convertTimezone
。
例如,如果您正在跟踪用户登录情况,那么如果某些登录计入周一而不是周二,您的业务可能不会因此而有所不同。但是,如果您使用 Metabase 进行精确操作,例如报税,您(和政府)可能会非常关心 12 月 31 日与 1 月 1 日发生的交易之间的差异。
支持的时区
Metabase 支持 tz 数据库时区。
参数
列
可以是以下任何一种
- 时间戳列的名称,
- 返回 时间戳 的自定义表达式,或
- 格式为
"YYYY-MM-DD"
或"YYYY-MM-DDTHH:MM:SS"
的字符串。
目标
:
- 您要分配给列的时区名称。
来源
:
- 您列的当前时区名称。
- 对于数据类型为
不带时区的时间戳
的列或表达式是必需的。 - 对于数据类型为
带有时区的时间戳
的列或表达式是可选的。 - 有关更多信息,请参阅 支持的数据类型。
我们支持 tz 数据库 时区名称(例如 “Canada/Eastern” 而不是 “EST”)。
创建自定义报告日期
假设您有一些存储在一个或多个时区(源时间)中的时间序列数据。您希望为居住在 EST 的团队创建自定义报告日期。
源时间 | 团队报告时间 (EST) |
---|---|
2022 年 12 月 28 日,10:00:00 | 2022 年 12 月 28 日,07:00:00 |
2022 年 12 月 28 日,21:00:00 | 2022 年 12 月 28 日,19:00:00 |
2022 年 12 月 27 日,08:00:00 | 2022 年 12 月 27 日,05:00:00 |
如果源时间存储为带有时区的时间戳
或带有偏移量的时间戳
,您只需提供目标
时区
convertTimezone([Source Time], 'EST')
如果源时间存储为不带时区的时间戳
,您*必须*提供源
时区(这将取决于您的数据库时区)
convertTimezone([Source Time], 'EST', 'UTC')
通常,最好使用目标时区的名称标记 convertTimezone
列(或将目标时区添加到模型的元数据中)。我们保证这会使您的生活更轻松,当有人不可避免地询问为什么数字不匹配时。
如果您没有得到预期的结果
选择源时区
进行时区转换时,请确保您了解正在使用的源时区。同一表格、问题或模型中的不同列(甚至不同行)可能位于不同的“源”时区。
可能的源时区 | 描述 | 示例 |
---|---|---|
客户端时区 | 事件发生的时区。 | 一个网站分析服务可能会以访问您网站的每个人的当地时区捕获数据。 |
数据库时区 | 已添加到数据库中时间戳的时区元数据。 | 通常的做法是将所有时间戳存储在 UTC 中。 |
无时区 | 缺少时区元数据 | 数据库不*要求*您存储带有时区元数据的时间戳。 |
Metabase 报告时区 | Metabase 用来*显示*时间戳的时区。 | 即使日期和时间在您的数据库中以 UTC 格式存储,Metabase 也可以以 PST 格式显示它们。 |
例如,假设您有一个表格,其中一行代表访问过您网站的每个人。仅凭查看2022 年 12 月 28 日,下午 12:00
,很难判断“原始”时间戳是否是
- 使用数据库的时区(通常为 UTC)存储,
- 未存储时区元数据(例如,如果网站访问者在香港,则时间戳
2022 年 12 月 28 日,下午 12:00
可能“隐式”使用香港时间), - 在您的 Metabase 报告时区*显示*。
有关更多详细信息,请参阅 限制。
支持的数据类型
数据类型 | 适用于 convertTimezone |
---|---|
字符串是 | ❌ |
数字 | ❌ |
时间戳 | ✅ |
布尔值 | ❌ |
JSON | ❌ |
我们使用“timestamp”和“datetime”来指代 Metabase 支持的任何时间数据类型。
如果您的时间戳在数据库中以字符串或数字形式存储,管理员可以从表元数据页面将其转换为时间戳。
为了使用 convertTimezone
而不遇到错误或难以察觉的疏漏,您应该知道 timestamp
数据类型有几种变体
数据类型 | 描述 | 示例 |
---|---|---|
带时区的时间戳 |
了解位置。 | 2022-12-28T12:00:00 AT TIME ZONE 'America/Toronto' |
带偏移量的时间戳 |
了解与 UTC 的时间差。 | 2022-12-28T12:00:00-04:00 |
不带时区的时间戳 |
无时区信息。 | 2022-12-28T12:00:00 |
请注意,时间戳的第一部分采用 UTC(与 GMT 相同)。时区或偏移量会告诉您在给定时间区需要添加或减去多少时间。
convertTimezone
将适用于所有三种时间戳类型,但 convertTimezone
的输出将始终是 不带时区的时间戳
。
限制
convertTimezone
目前不适用于以下数据库
- Amazon Athena
- Databricks
- Druid
- MongoDB
- Presto
- SparkSQL
- SQLite
- Metabase 示例数据库
关于源时区的注意事项
Metabase 显示不带时区或偏移信息的时间戳,这就是为什么在使用 convertTimezone
时您必须非常小心源时区的原因。
Metabase 报告时区仅适用于 带有时区的时间戳
或 带有偏移量的时间戳
数据类型。例如
数据库中的原始时间戳 | 数据类型 | 报告时区 | 显示为 |
---|---|---|---|
2022-12-28T12:00:00 AT TIME ZONE 'CST' |
带时区的时间戳 |
“加拿大/东部” | 2022 年 12 月 28 日下午 1:00 |
2022-12-28T12:00:00-06:00 |
带偏移量的时间戳 |
“加拿大/东部” | 2022 年 12 月 28 日下午 1:00 |
2022-12-28T12:00:00 |
不带时区的时间戳 |
“加拿大/东部” | 2022 年 12 月 28 日上午 12:00 |
Metabase 报告时区不适用于 convertTimezone
表达式的输出。例如
convertTimezone("2022-12-28T12:00:00 AT TIME ZONE 'Canada/Central'", "Canada/Pacific", "Canada/Central")
将生成一个原始的不带时区的时间戳
2022-12-28T04:00:00
并在 Metabase 中显示为
Dec 28, 2022, 4:00 AM
如果您对不带时区的时间戳
使用convertTimezone
,请确保使用“UTC”作为源
时区,否则表达式将错误地移动您的时间戳。例如,如果我们的不带时区的时间戳
仅“隐含”在 CST 中,我们应该使用“UTC”作为源
参数以获得与上述相同的结果。
例如,如果我们将“CST”选作不带时区的时间戳
的源
时区
convertTimezone("2022-12-28T12:00:00", "Canada/Pacific", "Canada/Central")
我们将得到原始的不带时区的时间戳
2022-12-28T10:00:00
在 Metabase 中显示为
Dec 28, 2022, 10:00 AM
相关函数
本节介绍与 Metabase convertTimezone
表达式工作方式相同的功能和公式,并提供有关如何为您的用例选择最佳选项的说明。
SQL
当您使用查询构建器运行查询时,Metabase 会将您的图形查询设置(过滤器、摘要等)转换为查询,并针对您的数据库运行该查询以获取结果。
如果我们的时间戳示例数据是存储在 PostgreSQL 数据库中的不带时区的时间戳
SELECT source_time::TIMESTAMP AT TIME ZONE 'UTC' AT TIME ZONE 'EST' AS team_report_time_est
与 convertTimezone
表达式相同,其中 source
参数设置为 'UTC'
convertTimezone([Source Time], "Canada/Eastern", "UTC")
如果source_time
是一个带有时区的时间戳
或带偏移量的时间戳
(例如,在 Snowflake 数据库中),那么我们不需要在 SQL 或 Metabase 中指定源时区。
SELECT convert_timezone('America/Toronto', source_time) AS team_report_time_est
与此相同
convertTimezone([Source Time], "Canada/Eastern")
请记住,时区名称取决于您的数据库。例如,Snowflake 不接受大多数时区缩写(如 EST)。
电子表格
如果我们的时间戳示例数据在一个电子表格中,其中“源时间”在 A 列,我们可以通过显式减去小时来将其更改为 EST
A1 - TIME(5, 0, 0)
以获得与此相同的结果
convertTimezone([Client Time], "Canada/Eastern")
Python
如果时间戳示例数据存储在pandas
数据框中,您可以首先将源时间列转换为带有时区信息的时间戳
对象(基本上是将不带时区的时间戳
转换为带时区的时间戳
),然后使用tz_convert
将时区更改为 EST
df['Source Time (UTC)'] = pd.to_timestamp(df['Source Time'], utc=True)
df['Team Report Time (EST)'] = df['Source Time (UTC)'].dt.tz_convert(tz='Canada/Eastern')
以执行与嵌套 convertTimezone
表达式相同的操作
convertTimezone(convertTimezone([Source Time], "UTC"), "Canada/Eastern", "UTC")
延伸阅读
阅读其他版本的 Metabase 的文档。