Улей: как преобразовать гггг-мм-ддтчч: мм: сс: сссз в часовые единицы - PullRequest
2 голосов
/ 22 марта 2020

У меня есть следующие метки времени:

2020-03-09T07:34:06:825Z
2020-03-09T07:54:12:220Z
2020-03-09T03:54:11:041Z
2020-03-09T09:22:10:220Z
2020-03-09T11:13:36:217Z
2020-03-09T11:23:26:040Z
2020-03-09T11:43:35:721Z

И я хотел бы конвертировать их в почасовые единицы, такие как:

2020-03-09T07:00:00
2020-03-09T07:00:00
2020-03-09T03:00:00
2020-03-09T09:00:00
2020-03-09T11:00:00
2020-03-09T11:00:00
2020-03-09T11:00:00

Будет ли это возможно? Любая помощь будет оценена. Stackoverflow был спасителем жизни. Это может быть в формате datetime или string. Спасибо всем!

Ответы [ 2 ]

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

Использование regexp_replace:

with your_data as (
select stack(
'2020-03-09T07:34:06:825Z',
'2020-03-09T07:54:12:220Z',
'2020-03-09T03:54:11:041Z',
'2020-03-09T09:22:10:220Z',
'2020-03-09T11:13:36:217Z',
'2020-03-09T11:23:26:040Z',
'2020-03-09T11:43:35:721Z'
) as str
)

select regexp_replace(str,'(\\d{4}-\\d{2}-\\d{2})T(\\d{2}).*','$1T$2:00:00') 
   from your_data;

Результат:

2020-03-09T07:00:00
2020-03-09T07:00:00
2020-03-09T03:00:00
2020-03-09T09:00:00
2020-03-09T11:00:00
2020-03-09T11:00:00
2020-03-09T11:00:00

Объяснение:

Регулярное выражение определяет две группы:

$ 1 - часть даты (\\d{4}-\\d{2}-\\d{2})

$ 2 - это часовая часть после T '(\ d {2})', все остальное в конце .* игнорируется.

Вы извлекаете '$1T$2:00:00'

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

Используйте unix_timestamp и from_unixtime функции для преобразования и форматирования требуемой метки времени.

select from_unixtime(unix_timestamp(string("2020-03-09T07:34:06:825Z"),"yyyy-MM-dd'T'hh:mm:ss:SSS'Z'"),"yyyy-MM-dd'T'hh:00:00") as new_ts;

+-------------------+
|new_ts             |
+-------------------+
|2020-03-09T07:00:00|
+-------------------+

Explanation:

unix_timestamp(
string("2020-03-09T07:34:06:825Z"), --sample data
"yyyy-MM-dd'T'hh:mm:ss:SSS'Z'") --match the data format

from_unixtime('unix_timestamp...etc',"yyyy-MM-dd'T'hh:00:00") --to format as required
...