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)