Hive: конвертирует строковую дату и время с пропущенными секундами в "гггг-мм-дд'т'хч: мм: сс.ссс'з '" - PullRequest
1 голос
/ 12 марта 2020

Я использую следующий код для преобразования строковой переменной datetime в datetime, но в преобразованной строке отсутствует часть SSS.

Используемый код:

cast(FROM_UNIXTIME(UNIX_TIMESTAMP(oldtime, "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"),"yyyy-MM-dd HH:mm:ss.SSS") as timestamp) as newtime

Результат:

2019-03-08T18: 28: 36,901Z преобразуется в 08MAR2019: 18: 28: 36,000000

Некоторые другие старые значения в строке:

2020-03-09T16:05:06:827Z
2020-03-09T16:03:19:354Z
2020-03-11T16:03:57:280Z
2020-03-10T16:02:57:642Z
2020-03-10T16:04:07:455Z
2020-03-10T16:04:09:737Z
2020-03-10T16:03:57:280Z
2020-03-10T16:02:46:816Z

Часть SSS '901' отсутствует в преобразованном времени. Нужна помощь в сохранении части SSS, поскольку мне нужно отсортировать записи по их точному времени.

Спасибо!

Ответы [ 2 ]

1 голос
/ 12 марта 2020

Просто замените 'T' пробелом ' ', удалите 'Z' и замените последнюю ':' точкой, например:

  select regexp_replace('2020-03-09T16:05:06:827Z','(.*?)T(.*?):([^:]*?)Z$','$1 $2\\.$3');

Результат:

2020-03-09 16:05:06.827

Читать также этот ответ, если вам нужно конвертировать в другой формат, сохраняя миллисекунды: { ссылка }

1 голос
/ 12 марта 2020

from_unixtime всегда до минут (yyyy-MM-dd HH:mm:ss), чтобы получить millisecs нам нужно сделать некоторые обходные пути.

  • мы извлечем millisecs из старого времени, используя regexp_extract, затем concat, что приведет к from_unixtime результату и, наконец, приведем к timestamp.

Example:

select old_time,
timestamp(concat_ws(".", --concat_ws with . and cast
FROM_UNIXTIME(UNIX_TIMESTAMP(old_time, "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"),"yyyy-MM-dd HH:mm:ss"), -- from_unixtime and unix_timestamp to convert without millisecs
regexp_extract(string(old_time),".+\\.(.*)(?i)z",1))) as newtime from --regexp_extract to extract last 3 digits before z then concat
(select string("2020-03-11T21:14:41.335Z")old_time)e

+------------------------+-----------------------+
|old_time                |newtime                |
+------------------------+-----------------------+
|2020-03-11T21:14:41.335Z|2020-03-11 21:14:41.335|
+------------------------+-----------------------+

UPDATE:

Ваши данные выборки имеют : до миллисекунд, попробуйте выполнить следующий запрос:

select old_time,
    timestamp(concat_ws(".", --concat_ws with . and cast
    FROM_UNIXTIME(UNIX_TIMESTAMP(old_time, "yyyy-MM-dd'T'HH:mm:ss:SSS'Z'"),"yyyy-MM-dd HH:mm:ss"), -- from_unixtime and unix_timestamp to convert without millisecs
    regexp_extract(string(old_time),".+\\:(.*)(?i)z",1))) as newtime from --regexp_extract to extract last 3 digits before z then concat
    (select string("2020-03-11T21:14:41:335Z")old_time)e
...