首页 > 解决方案 > 动态更改 DateTime64 时区(使用表中的时区)

问题描述

我想将时间戳转换为从另一个表动态获取的时区。我的第一次尝试是将我的数据表与包含时区的表连接起来,然后使用toTimeZone函数进行转换。但是,我发现动态传入时区时不会发生转换:

SELECT 
    ts,
    tzs.timezone,
    toTimeZone(ts, 'America/New_York') AS ts_ny1, <-- manual, works
    toTypeName(ts_ny1) AS ts_ny1_type,
    toTimeZone(ts, tzs.timezone) AS ts_ny2, <-- dynamic, doesn't work
    toTypeName(ts_ny2) AS ts_ny2_type,
    toTimeZone(ts, toString(tzs.timezone)) AS ts_ny3, <-- dynamic, doesn't work
    toTypeName(ts_ny3) AS ts_ny3_type
FROM my_db.my_timestamps 
LEFT JOIN my_db.my_timezones as tzs
ON my_db.my_timestamps.my_key = tzs.my_key
LIMIT 1
┌─────────────────────────ts─┬─timezone───────────┬─────────────────────ts_ny1─┬─ts_ny1_type───────────────────────┬─────────────────────ts_ny2─┬─ts_ny2_type──────────┬─────────────────────ts_ny3─┬─ts_ny3_type──────────┐
│ 2020-04-01 00:00:00.000000 │ 'America/New_York' │ 2020-03-31 20:00:00.000000 │ DateTime64(6, 'America/New_York') │ 2020-04-01 00:00:00.000000 │ DateTime64(6, 'UTC') │ 2020-04-01 00:00:00.000000 │ DateTime64(6, 'UTC') │
└────────────────────────────┴────────────────────┴────────────────────────────┴───────────────────────────────────┴────────────────────────────┴──────────────────────┴────────────────────────────┴──────────────────────┘

tzs.timezone是一个字符串并包含撇号(我明确输入它们\'):

┌─timezone───────────┬─toTypeName(timezone)───┐
│ 'America/New_York' │ LowCardinality(String) │
└────────────────────┴────────────────────────┘

但我也尝试过不使用它们以达到同样的效果。

是否可以按所示动态转换时区?

谢谢

编辑:也许注意到我收到一条带有修改后的查询版本的错误消息可能会有所帮助:

SELECT 
    ts,
    tzs.timezone,
    toStartOfInterval(ts, INTERVAL 1 month),
    toStartOfInterval(ts, INTERVAL 1 month, tzs.timezone)
FROM my_db.my_timestamps 
LEFT JOIN my_db.my_timezones as tzs
ON my_db.my_timestamps.my_key = tzs.my_key
LIMIT 1
Code: 44. DB::Exception: Received from localhost:9000. DB::Exception: Argument at index 2 for function toStartOfInterval must be constant: while executing 'FUNCTION toStartOfInterval(ts : 0, toIntervalMonth(1) :: 2, timezone : 1) -> toStartOfInterval(ts, toIntervalMonth(1), timezone) Date : 4'.

我真的不明白这意味着什么,除了它不是预期的:)

标签: datetimetimezoneclickhouse

解决方案


推荐阅读