【发布时间】:2018-07-15 23:28:18
【问题描述】:
Presto 中的这个查询:
select *,
cast(ts_w_tz as timestamp) as ts,
cast(substr(cast(ts_w_tz as varchar), 1, 23) as timestamp) as local_ts_workaround
from (select timestamp '2018-02-06 23:00:00.000 Australia/Melbourne' as ts_w_tz);
返回:
ts_w_tz | ts | local_ts_workaround
---------------------------------------------+-------------------------+-------------------------
2018-02-06 23:00:00.000 Australia/Melbourne | 2018-02-06 12:00:00.000 | 2018-02-06 23:00:00.000
如您所见,将带时区的时间戳转换为时间戳的行为导致时间戳被转换回 UTC 时间(例如ts)。根据local_ts_workaround,IMO 正确的行为应该是返回时间戳的“墙上读数”。
我意识到有很多关于 Presto 对此的处理是错误的并且不符合 SQL 标准的帖子,并且正在修复中。但与此同时,这是一个很大的痛苦,因为似乎没有内置方法可以在没有时区的情况下获得本地化时间戳(根据local_ts_workaround)。
显然,我现在有字符串转换的解决方法,但这看起来很可怕。我想知道是否有人有更好的解决方法或者可以指出我遗漏的东西?
谢谢。
【问题讨论】:
-
问题跟踪此错误:github.com/prestodb/presto/issues/7122(时间戳 W/TZ 转换回任何会话区域,不一定是 UTC)。您的解决方法很有效,但
format_datetime+parse_datetime的组合可能更“明显正确”。