DatetimeDiff
datetimeDiff 使用指定的时间单位获取两个日期时间值之间的时间量。请注意,差值是按*整*单位计算的(请参阅下面的示例)。
| 语法 | 示例 |
|---|---|
datetimeDiff(日期时间1, 日期时间2, 单位) |
datetimeDiff("2022-02-01", "2022-03-01", "月") |
| 使用指定的时间单位获取两个日期时间之间的差值(日期时间2 减去日期时间1)。 | 1 |
参数
日期时间1 和 日期时间2 可以是
- 时间戳列的名称,
- 返回 日期时间 的自定义表达式,或者
- 格式为
"YYYY-MM-DD"或"YYYY-MM-DDTHH:MM:SS"的字符串(如上例所示)。
单位 可以是以下任何一种
- “年”
- “季度”
- “月”
- “周”
- “日”
- “小时”
- “分钟”
- “秒”
计算年龄
假设您是一名奶酪制造商,您希望跟踪您的熟化过程
| 奶酪 | 开始熟化 | 熟化结束 | 熟化年龄(月) |
|---|---|---|---|
| 波萝伏洛干酪 | 2022 年 1 月 19 日 | 2022 年 3 月 17 日 | 1 |
| 羊乳酪 | 2022 年 1 月 25 日 | 2022 年 5 月 3 日 | 3 |
| 杰克奶酪 | 2022 年 1 月 27 日 | 2022 年 10 月 11 日 | 8 |
熟化年龄(月)是一个自定义列,其表达式为
datetimeDiff([Aging Start], [Aging End], "month")
要计算奶酪的*当前*熟化年龄(以月为单位),您可以使用 now 作为第二个日期时间参数,如下所示
datetimeDiff([Aging Start], now, "month")
要计算奶酪的当前熟化年龄(以天为单位),您可以使用
datetimeDiff([Aging Start], now, "day")
支持的数据类型
| 数据类型 | 适用于 datetimeDiff |
|---|---|
| 字符串是 | ❌ |
| 数字 | ❌ |
| 时间戳 | ✅ |
| 布尔值 | ❌ |
| JSON | ❌ |
我们使用“时间戳”和“日期时间”来指代 Metabase 支持的任何时间数据类型。有关 Metabase 中这些数据类型的更多信息,请参阅 时区。
如果您的时间戳在数据库中以字符串或数字形式存储,管理员可以从表元数据页面将其转换为时间戳。
限制
以下数据库目前不支持 datetimeDiff
- Druid
相关函数
本节介绍与 Metabase datetimeDiff 表达式功能相同且具有相同工作方式的函数和公式,并提供有关如何选择最适合您用例的选项的说明。
SQL
当您使用查询构建器运行查询时,Metabase 会将您的图形查询设置(过滤器、摘要等)转换为查询,并针对您的数据库运行该查询以获取结果。
如果我们的 奶酪样本数据 存储在 PostgreSQL 数据库中
SELECT DATE_PART('month', AGE(aging_end, aging_start)) AS mature_age_months
FROM cheese
等同于 Metabase datetimeDiff 表达式
datetimeDiff([Aging Start], [Aging End], "month")
某些数据库(如 Snowflake 和 BigQuery)支持 DATEDIFF 或 DATE_DIFF 等函数。有关更多信息,请查看我们的 常见 SQL 参考指南 列表。
电子表格
如果我们的 奶酪样本数据 位于一个电子表格中,其中“开始熟化”在 B 列,“结束熟化”在 C 列
DATEDIF(B1, C1, "M")
产生与以下结果相同的结果
datetimeDiff([Aging Start], [Aging End], "month")
是的,DATEDIF 看起来有点不对劲,但电子表格函数确实是只有一个“f”的 DATEDIF(),而不是 DATEDIFF()。
Python
假设 奶酪样本数据 在一个名为 df 的 pandas 数据框列中,您可以直接减去日期,并使用 numpy 的 timedelta64 将差值转换为月
df['Mature Age (Months)'] = (df['Aging End'] - df['Aging Start']) / np.timedelta64(1, 'M')
等同于
datetimeDiff([Aging Start], [Aging End], "month")
延伸阅读
阅读其他版本的 Metabase 的文档。