Presto SQL: изменение часовых поясов с использованием строки часового пояса, поступающей в результате запроса, не работает - PullRequest
0 голосов
/ 08 сентября 2018

Я подключаюсь к AWS Athena через Mode Analytics Platform и запрашиваю таблицу, используя механизм запросов (основанный на Presto 0.172). Эта таблица public.zones содержит информацию о часовом поясе, хранящуюся в столбце с именем time_zone в некоторых регионах, которые меня интересуют, и хранится как varchar.

.

Например, если я наберу:

SELECT time_zone 
FROM public.zones
LIMIT 4;

Я получаю (как и ожидалось):

time_zone
----------  
US/Pacific 
US/Eastern 
US/Eastern 
US/Eastern 

Я могу запустить этот тестовый запрос:

SELECT 
  timestamp '2017-06-01 12:34:56.789' AT TIME ZONE 'US/Eastern' AS time_eastern,
  time_zone 
FROM public.zones
LIMIT 4;

и я получаю (как и ожидалось)

time_eastern                        time_zone
----------------------------------  ----------
2017-06-01 08:34:56.789 US/Eastern  US/Pacific
2017-06-01 08:34:56.789 US/Eastern  US/Eastern
2017-06-01 08:34:56.789 US/Eastern  US/Eastern
2017-06-01 08:34:56.789 US/Eastern  US/Eastern

Теперь я хочу представить одну и ту же строку времени '2017-06-01 12:34:56.789' в разных часовых поясах, которые я запрашиваю из таблицы зон. Я ожидал выполнения следующего запроса. (Он работает на PostgreSQL).

SELECT 
  timestamp '2017-06-01 12:34:56.789' AT TIME ZONE time_zone AS time_custom,
  time_zone 
FROM public.zones
LIMIT 4;

Я получаю следующую ошибку:

[Simba][AthenaJDBC](100071) An error has been thrown from the AWS Athena client. 
line 2:52: no viable alternative at input 'TIME ZONE time_zone'

В чем причина того, что это не работает в Presto SQL / AWS Athena Query Engine?

Может кто-нибудь предложить какие-нибудь обходные пути или какова моя синтаксическая ошибка, если таковая имеется?

1 Ответ

0 голосов
/ 08 сентября 2018

В настоящее время AT TIME ZONE принимает только литерал или интервал. Ожидаемое поведение еще не реализовано. Вы можете отслеживать соответствующую проблему здесь: https://github.com/prestosql/presto/issues/135

В качестве обходного пути вы можете привести свое значение метки времени к varchar, объединить с зоной и привести к метке времени с часовым поясом.

presto> select cast(cast(t as varchar) || ' ' || zone as timestamp with time zone)
  from (values (timestamp '2017-06-01 12:34:56.789', 'US/Pacific')) x(t, zone);
                    _col0
---------------------------------------------
 2017-06-01 12:34:56.789 America/Los_Angeles
(1 row)

(Примечание: протестировано на Presto 0.210. Если это еще не работает на Афине, дайте мне знать.)

...