Presto:将时间戳w / TZ转换为普通时间戳而不转换为UTC

时间:2018-02-06 00:59:54

标签: sql presto

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)。

显然,我现在有字符串转换解决方法,但这看起来很糟糕。我想知道是否有人有更好的解决方法或者可以指出我错过的东西?

感谢。

2 个答案:

答案 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);