#datetime #timezone #presto #amazon-athena
#datetime #Часовой пояс #presto #amazon-athena
Вопрос:
Я пытаюсь преобразовать столбец даты строкового типа в тип даты в AWS Athena. В этом столбце содержатся записи формата %m-%d-%Y
или %m-%d-%Y %H:%i:%s
Я использую приведенный ниже запрос в AWS Athena для решения вышеуказанных проблем:
SELECT col1, col2,
Coalesce(
try(date_parse(replace("col3", '/', '-'), '%m-%d-%Y %H:%i')),
try(date_parse(replace("col3", '/', '-'), '%m-%d-%Y')),
try(date_parse(replace("col3", '/', '-'), '%Y-%m-%d %H:%i:%s'))
) AS date_col
FROM "db"."table"
Этот запрос отлично работает для вышеупомянутых форматов. Но есть некоторые записи с часовым поясом, такие как 3/10/2019 11:31 PM EDT
. Я не могу проанализировать это, поэтому эти записи просто отображаются как NULL.
Я пробовал try(date_parse(replace("col3", '/', '-'), '%m-%d-%Y %H:%i %p %z'))
, но это тоже не сработало. Есть ли способ сделать это с date_parse()
? Я также пробовал что-то вроде parse_datetime("col3", 'MM/DD/YYYY' 'HH:mm' 'P' 'Z')
, но это тоже не сработало. Есть ли другой обходной путь для этого или я что-то здесь упускаю?
Ответ №1:
Вы можете проанализировать его с помощью следующего шаблона для parse_datetime
функции: MM/dd/YYYY hh:mm a z
. Формат шаблона основан на времени Joda.
Например:
WITH t(x) AS (VALUES '3/10/2019 11:31 PM EDT')
SELECT parse_datetime(x, 'MM/dd/YYYY hh:mm a z')
FROM t
выдает:
_col0
------------------------------------------
2019-03-10 23:31:00.000 America/New_York
Комментарии:
1. Я попробовал это, и это не удалось с этой ошибкой
NOT_SUPPORTED: Unsupported Hive type: timestamp with time zone.
2. Если вы пытаетесь вставить результат в другую таблицу, вам нужно преобразовать его в другой поддерживаемый тип (например, TIMESTAMP). Обратите внимание, что Athena основана на очень старой версии Presto, выпущенной более 3 лет назад, и некоторые функции в последних версиях Presto могут отсутствовать там.
3. Я пытался сделать
Coalesce( try(date_parse(replace("col3", '/', '-'), '%m-%d-%Y %H:%i')), try(CAST(parse_datetime(replace("col3", '/', '-'),'MM/dd/YYYY hh:mm a z') AS TIMESTAMP))
, но все строки с часовым поясом были просто преобразованы в нули