动态更改 DateTime64 时区使用表中的时区

问题描述

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

SELECT 
    ts,tzs.timezone,toTimeZone(ts,'America/New_York') AS ts_ny1,<-- manual,works
    toTypeName(ts_ny1) AS ts_ny1_type,tzs.timezone) AS ts_ny2,<-- dynamic,doesn't work
    toTypeName(ts_ny2) AS ts_ny2_type,toString(tzs.timezone)) AS ts_ny3,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,toStartOfInterval(ts,INTERVAL 1 month),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'.

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

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)