Преобразование столбца 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;
Другие вопросы по тегам