Преобразование столбца timestamp / varchar в bigint в presto, который содержит два разных формата даты
У меня есть исходная таблица click
со столбцом с именем click_date
чей тип данных varchar
, он содержит значения с двумя разными форматами дат в одном столбце. Например:
Jul 17 2018 4:54PM
2019-02-05 08:20:29.000
У меня есть целевая таблица с именем click
и мне нужно сопоставить данные с ним в столбце с именем click_date
чей тип данных bigint
.
Таким образом, при выполнении кастинга возникает ошибка
Пробовал следующее:
td_time_parse(cast(cast(click_date as timestamp)as varchar))
Но это не решает оба формата. Мне нужно преобразовать оба формата даты в целое число, чтобы его можно было загрузить в цель.
обратите внимание, что целевой тип данных не может быть изменен, и это bigint. Любые лиды будут оценены.
2 ответа
Вы можете использовать комбинацию date_parse
а также to_unixtime
чтобы преобразовать вашу дату в varchar в unixtimestamp (который имеет двойной тип данных).
для формата даты: 2019-02-05 08:20:29.000
to_unixtime(date_parse('2019-02-05 08:20:29.000','%Y-%m-%d %h:%i:%s'))
для формата даты: 17 июля 2018 г.
to_unixtime(date_parse('Jul 17 2018','%b %d %Y'))
Это вернет вам двойной тип данных вашей даты, который вы можете сохранить в своей базе данных.
Вы можете использовать приведенный ниже запрос для обработки обоих форматов дат с помощью одного выражения. По сути, это выглядит, если дата / отметка времени начинается с числа или нет.
select
if(click_date rlike '^[0-9]', unix_timestamp(click_date ,'yyyy-MM-dd HH:mm:ss'), unix_timestamp(click_date,'MMM dd yyyy')) as click_date_mod
from click;