PrestoDB: приведение временной метки с TZ к простой временной метке БЕЗ конвертации в UTC

Этот запрос в PrestoDB:

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,

Я понимаю, что есть много сообщений о том, как Presto обрабатывает это неправильно и не соответствует стандарту SQL, и что в работе есть исправление. Но в то же время это является основной болью, так как эффект, по-видимому, заключается в том, что не существует встроенного способа получить локализованную временную метку с OUT timezone (согласно local_ts_workaround).

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

Благодарю.

2 ответа

Похоже, что нет отличного решения, но, основываясь на предыдущем ответе, мне это нравится немного больше ... см. 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);
select cast(from_iso8601_timestamp('2018-02-06T23:00:00.000Z') as timestamp)
Другие вопросы по тегам