Mam następujące znaczniki czasu:

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

I chciałbym je przekonwertować w jednostce godzinowej, takiej jak:

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

Czy to będzie możliwe? Wszelka pomoc będzie doceniana. Stackoverflow był oszczędnością życia. Może być w formacie datetime lub string. Dziękuję wam wszystkim!

3
lydias 22 marzec 2020, 21:25

2 odpowiedzi

Najlepsza odpowiedź

Użyj unix_timestamp i from_unixtime , aby przekonwertować i formatować wymagane znacznik czasu.

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
1
Shu 22 marzec 2020, 19:13

Korzystanie z 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;

Wynik:

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

Wyjaśnienie:

Wyrażenie regularne definiuje dwie grupy:

1 $ jest częścią daty (\\d{4}-\\d{2}-\\d{2})

2 $ znajduje się część po t '(d {2}) Wszystko inne na końcu .* jest ignorowane.

Wyodrębniasz '$1T$2:00:00'

1
leftjoin 23 marzec 2020, 06:26