ConvertTimezone

convertTimezone 透過從時間戳記中加入或減去正確的間隔,將時間戳記移至指定的時區。

語法 範例
convertTimezone(欄位, 目標, 來源) convertTimezone("2022-12-28T12:00:00", "Canada/Pacific", "Canada/Eastern")
將時間戳記從來源時區移至目標時區。 傳回值 2022-12-28T09:00:00,顯示為 2022 年 12 月 28 日 上午 9:00

時間戳記和時區處理起來相當棘手(很容易犯錯,而且難以察覺),因此只有在資料的解讀對基於時間的截止點很敏感時,才應嘗試使用 convertTimezone

例如,如果您正在追蹤使用者隨時間的登入次數,如果某些登入次數被計算在星期一而不是星期二,您的業務可能不會有不同的運作方式。但是,如果您使用 Metabase 來進行精確的事情,例如報稅,您(和政府)可能會更關心 12 月 31 日與 1 月 1 日發生的交易之間的差異。

支援的時區

Metabase 支援 tz 資料庫時區

參數

column 可以是下列任一項

  • 時間戳記欄位的名稱、
  • 傳回 時間戳記 的自訂表達式,或
  • 字串格式 "YYYY-MM-DD"YYYY-MM-DDTHH:MM:SS"

目標:

  • 您想要指派給欄位的時區名稱。

來源:

  • 欄位目前時區的名稱。
  • 針對資料類型為 timestamp without time zone 的欄位或表達式為必要項目。
  • 針對資料類型為 timestamp with time zone 的欄位或表達式為選用項目。
  • 如需更多資訊,請參閱 接受的資料類型

我們支援 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

如果 **來源時間** 儲存為 timestamp with time zonetimestamp with offset,您只需要提供 target 時區

convertTimezone([Source Time], 'EST')

如果 **來源時間** 儲存為 timestamp without time zone,您*必須*提供 source 時區(這將取決於您的資料庫時區)

convertTimezone([Source Time], 'EST', 'UTC')

通常最好使用目標時區的名稱標記 convertTimezone 欄位(或將目標時區新增至模型的元數據)。我們保證當有人不可避免地詢問為什麼數字不符時,這會讓您的生活更輕鬆。

如果您沒有獲得預期的結果

  • 檢查您是否使用了正確的 來源時區
  • 向您的資料庫管理員詢問 timestamp with time zonetimestamp without time zone 的差異(如需更多資訊,請參閱 接受的資料類型)。

選擇來源時區

當您進行時區轉換時,請確保您知道您正在使用的來源時區。同一個表格、問題或模型中的不同欄位(甚至不同列)可能位於不同的「來源」時區。

可能的來源時區 描述 範例
用戶端時區 事件發生的時區。 網站分析服務可能會在每個造訪您網站的人的當地時區中擷取資料。
資料庫時區 已新增至資料庫中時間戳記的時區元數據。 將所有時間戳記儲存在 UTC 中是很常見的資料庫做法。
無時區 遺失時區元數據 資料庫*不要求*您儲存具有時區元數據的時間戳記。
Metabase 報表時區 Metabase 用於*顯示*時間戳記的時區。 即使日期和時間在您的資料庫中儲存為 UTC,Metabase 也可以用 PST 顯示日期和時間。

例如,假設您有一個表格,每位造訪您網站的人都有一列。光看 2022 年 12 月 28 日,下午 12:00,很難判斷「原始」時間戳記是否為

  • 使用您的資料庫時區(通常為 UTC)儲存、
  • 在沒有時區元數據的情況下儲存(例如,如果網站訪客位於 HKT,則時間戳記 2022 年 12 月 28 日,下午 12:00 可能「隱含地」使用香港時間)、
  • 在您的 Metabase 報表時區中*顯示*。

如需更多血淋淋的細節,請參閱 限制

接受的資料類型

資料類型 可與 convertTimezone 搭配使用
字串
數字
時間戳記
布林值
JSON

我們使用「時間戳記」和「日期時間」來談論 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 的輸出將始終是不具時區的 timestamp

限制

convertTimezone 目前不適用於下列資料庫

  • 亞馬遜雅典娜
  • Databricks
  • Druid
  • MongoDB
  • Presto
  • SparkSQL
  • SQLite
  • Metabase 範例資料庫

關於來源時區的注意事項

Metabase 顯示不具時區或偏移量資訊的時間戳記,這就是為什麼在使用 convertTimezone 時,您必須非常小心 來源時區

Metabase 報表時區僅適用於 timestamp with time zonetimestamp with offset 資料類型。例如

資料庫中的原始時間戳記 資料類型 報表時區 顯示為
2022-12-28T12:00:00 AT TIME ZONE 'CST' 具有時區的時間戳記 ‘Canada/Eastern’ 2022 年 12 月 28 日,上午 7:00
2022-12-28T12:00:00-06:00 具有偏移量的時間戳記 ‘Canada/Eastern’ 2022 年 12 月 28 日,上午 7:00
2022-12-28T12:00:00 不具時區的時間戳記 ‘Canada/Eastern’ 2022 年 12 月 28 日,凌晨 12:00

Metabase 報表時區將不適用於 convertTimezone 表達式的輸出。例如

convertTimezone("2022-12-28T12:00:00 AT TIME ZONE 'Canada/Central'", "Canada/Pacific", "Canada/Central")

將產生原始的 timestamp without time zone

2022-12-28T04:00:00

並在 Metabase 中顯示為

Dec 28, 2022, 4:00 AM

如果您在不具時區的 timestamp 上使用 convertTimezone,請確保使用 ‘UTC’ 作為 source 時區,否則表達式會將您的時間戳記移動錯誤的量。例如,如果我們的不具時區的 timestamp 僅「隱含地」位於 CST 中,我們應該使用 ‘UTC’ 作為 source 參數,以獲得與上述相同的結果。

例如,如果我們選擇 ‘CST’ 作為不具時區的 timestampsource 時區

convertTimezone("2022-12-28T12:00:00", "Canada/Pacific", "Canada/Central")

我們將獲得原始的 timestamp without time zone

2022-12-28T10:00:00

在 Metabase 中顯示為

Dec 28, 2022, 10:00 AM

本節涵蓋與 Metabase convertTimezone 表達式運作方式相同的函數和公式,並附註如何為您的使用案例選擇最佳選項。

SQL

當您使用查詢產生器執行問題時,Metabase 會將您的圖形化查詢設定(篩選條件、摘要等)轉換為查詢,並針對您的資料庫執行該查詢以取得結果。

如果我們的時間戳記範例資料是儲存在 PostgreSQL 資料庫中的 timestamp without time zone

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_timetimestamp with time zonetimestamp with offset(例如,在 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 資料框架中,您可以先將 **來源時間** 欄位轉換為具有時區的 timestamp 物件(基本上是將 timestamp without time zone 轉換為 timestamp with time zone),然後使用 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 版本的文件