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
)。根据{{1}},IMO正确的行为应该是返回时间戳的“壁读数”。
我意识到有许多关于Presto如何处理这个错误并且不符合SQL标准的帖子,并且有一个修复工作。但与此同时,这是一个很大的痛苦,因为效果是似乎没有内置的方法来获得带有时区的本地化时间戳(按照local_ts_workaround
)。
显然,我现在有字符串转换解决方法,但这看起来很糟糕。我想知道是否有人有更好的解决方法或者可以指出我错过的东西?
感谢。
答案 0 :(得分:1)
select cast(from_iso8601_timestamp('2018-02-06T23:00:00.000Z') as timestamp)
答案 1 :(得分:1)
似乎没有很好的解决方案,但基于之前的答案,我更喜欢这个……请参阅 date_format_workaround
列:
select *,
cast(from_iso8601_timestamp(date_format(ts_w_tz, '%Y-%m-%dT%H:%i:%s')) as timestamp) as date_format_workaround,
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);