您可以在 Presto / Athena 中为 AT TIME ZONE 的时区参数使用一列吗?

Can you use a column for the timezone parameter of AT TIME ZONE in Presto / Athena?

这是您可以在 Athena 中执行的操作-

SELECT date_utc AT TIME ZONE 'America/Chicago'
FROM
(
  SELECT TIMESTAMP '2018-09-09 12:00:00' as date_utc

) x;

在其他 sql 引擎中,您可以将 America/Chicago 更改为列 -

SELECT date_utc AT TIME ZONE x.timezone
FROM
(
  SELECT
    TIMESTAMP '2018-09-09 12:00:00' as date_utc,
    'America/Chicago' as timezone

) x;

在雅典娜你得到-

line 1:30: no viable alternative at input 'time zone x'

是否可以在 Athena 中使用 x.timezone?这似乎是一个错误。

看起来确实像是引擎中的错误。然而有趣的是,底层函数使用列参数。因此,您可以将其用作解决方法。

SELECT at_timezone(date_utc,x.timezone)
FROM
(
  SELECT
    TIMESTAMP '2018-09-09 12:00:00' as date_utc,
    'America/Chicago' as timezone

) x;

为上面的正确答案添加一些额外的上下文: AT_TIMEZONE 函数未记录在 presto 文档中。当有人使用 timestamp AT time zone tz 时,实际上调用的是 AT_TIMEZONE 函数。它似乎是一个内部功能,一些人已经在使用它。这是一个讨论它的问题:https://github.com/prestodb/presto/issues/5162

语法似乎是 AT_TIMEZONE(date_field, tz_field_or_string)