Улей литой строки на дату dd-MM-yyyy

Как я могу передать строку в формате "dd-MM-yyyy" в тип даты и в формате "dd-MM-yyyy" в Hive?

Что-то по строкам:

CAST('12-03-2010' as date 'dd-mm-yyyy')

Ответ 1

попробовать:

from_unixtime(unix_timestamp('12-03-2010' , 'dd-MM-yyyy'))

Ответ 2

Если я правильно понял, вы пытаетесь преобразовать строку, представляющую данную дату, в другой тип.

Примечание: (как упомянул @Samson Scharfrichter)

  • представление даты по умолчанию - ISO8601
  • дата хранится в двоичном формате (не в виде строки)

Есть несколько способов сделать это. И вы близки к решению. Я бы использовал CAST (который преобразуется в DATE_TYPE):

SELECT cast('2018-06-05' as date); 

Результат: 2018-06-05 DATE_TYPE

или (в зависимости от вашего шаблона)

select cast(to_date(from_unixtime(unix_timestamp('05-06-2018', 'dd-MM-yyyy'))) as date)

Результат: 2018-06-05 DATE_TYPE

И если вы решите преобразовать ISO8601 в тип даты:

select cast(to_date(from_unixtime(unix_timestamp(regexp_replace('2018-06-05T08:02:59Z', 'T',' ')))) as date);

Результат: 2018-06-05 DATE_TYPE

У Hive есть свои функции, я написал несколько примеров для иллюстрации этих функций date- и cast-:

Примеры функций даты и времени:

Преобразовать строку/метку времени/дату в дату

SELECT cast(date_format('2018-06-05 15:25:42.23','yyyy-MM-dd') as date); -- 2018-06-05 DATE_TYPE
SELECT cast(date_format(current_date(),'yyyy-MM-dd') as date); -- 2018-06-05 DATE_TYPE
SELECT cast(date_format(current_timestamp(),'yyyy-MM-dd') as date);  -- 2018-06-05 DATE_TYPE

Преобразовать строку/метку времени/дату в BIGINT_TYPE

SELECT to_unix_timestamp('2018/06/05 15:25:42.23','yyyy/MM/dd HH:mm:ss'); -- 1528205142 BIGINT_TYPE
SELECT to_unix_timestamp(current_date(),'yyyy/MM/dd HH:mm:ss'); -- 1528205000 BIGINT_TYPE
SELECT to_unix_timestamp(current_timestamp(),'yyyy/MM/dd HH:mm:ss'); -- 1528205142 BIGINT_TYPE

Преобразовать строку/метку времени/дату в строку

SELECT date_format('2018-06-05 15:25:42.23','yyyy-MM-dd'); -- 2018-06-05 STRING_TYPE
SELECT date_format(current_timestamp(),'yyyy-MM-dd'); -- 2018-06-05 STRING_TYPE
SELECT date_format(current_date(),'yyyy-MM-dd'); -- 2018-06-05 STRING_TYPE

Конвертировать BIGINT unixtime в STRING

SELECT to_date(from_unixtime(unixtime,'yyyy/MM/dd HH:mm:ss')); -- 2018-06-05 STRING_TYPE

Конвертировать строку в BIGINT unixtime

SELECT unix_timestamp('2018-06-05 15:25:42.23','yyyy-MM-dd') as TIMESTAMP; -- 1528149600 BIGINT_TYPE

Преобразовать строку в TIMESTAMP

SELECT cast(unix_timestamp('2018-06-05 15:25:42.23','yyyy-MM-dd') as TIMESTAMP); -- 1528149600 TIMESTAMP_TYPE

Идемпотент (Строка → Строка)

SELECT from_unixtime(to_unix_timestamp('2018/06/05 15:25:42.23','yyyy/MM/dd HH:mm:ss')); -- 2018-06-05 15:25:42 STRING_TYPE

Идемпотент (Дата → Дата)

SELECT cast(current_date() as date); -- 2018-06-26 DATE_TYPE

Текущая дата/метка времени

SELECT current_date(); -- 2018-06-26 DATE_TYPE
SELECT current_timestamp(); -- 2018-06-26 14:03:38.285 TIMESTAMP_TYPE

Ответ 3

AFAIK, вы должны переформатировать вашу строку в формате ISO, чтобы иметь возможность привести ее к дате:

cast(concat(substr(STR_DMY,7,4), '-',
            substr(STR_DMY,1,2), '-',
            substr(STR_DMY,4,2)
           )
     as date
     ) as DT

Чтобы отобразить дату в виде строки с определенным форматом, затем наоборот, если у вас нет куста 1. 2+ и вы можете использовать date_format()

=> Кстати, вы проверили документацию?

Ответ 4

Допустим, у вас есть столбец 'birth_day' в вашей таблице, который находится в строковом формате, вы должны использовать следующий запрос для фильтрации с использованием Birth_day

date_Format(birth_day, 'yyyy-MM-dd')

Вы можете использовать его в запросе следующим образом

select * from yourtable
where 
date_Format(birth_day, 'yyyy-MM-dd') = '2019-04-16';