Przypuszczalnie stałe T i Z wprowadzają w błąd, ponieważ nie są normalne model formatu daty i godziny elementy. Ale dokumentacja mówi:
Ujmujesz więc T i Z w cudzysłów, jako "T"
i "Z"
, w Twoim modelu formatu.
Jeśli nie interesuje Cię strefa czasowa, możesz użyć to_timestamp()
funkcja
:
to_timestamp('2015-03-24T07:08:24.000Z', 'YYYY-MM-DD"T"HH24:MI:SS.FF3"Z"')
Lub jeśli chcesz mieć strefę czasową, możesz użyć to_timestamp_tz()
funkcja
, który zostanie ustawiony domyślnie na strefę czasową bieżącej sesji (ponieważ w rzeczywistości jej nie określasz, Z nie jest interpretowane jako Zulu/UTC):
to_timestamp_tz('2015-03-24T07:08:24.000Z', 'YYYY-MM-DD"T"HH24:MI:SS.FF3"Z"')
Jeśli chcesz mieć strefę czasową i chcesz określić, że jest to UTC, możesz to wymusić za pomocą from_tz()
funkcja
:
from_tz(to_timestamp('2015-03-24T07:08:24.000Z', 'YYYY-MM-DD"T"HH24:MI:SS.FF3"Z"')), 'UTC')
Aby zobaczyć różnicę, jaką powodują, określając strefę czasową sesji jako demonstrację:
alter session set time_zone = 'America/New_York';
select to_timestamp('2015-03-24T07:08:24.000Z', 'YYYY-MM-DD"T"HH24:MI:SS.FF3"Z"') as no_tz,
to_timestamp_tz('2015-03-24T07:08:24.000Z', 'YYYY-MM-DD"T"HH24:MI:SS.FF3"Z"') as default_tz,
from_tz(to_timestamp('2015-03-24T07:08:24.000Z', 'YYYY-MM-DD"T"HH24:MI:SS.FF3"Z"'), 'UTC') as utc_tz
from dual;
NO_TZ
--------------------------------------------------
DEFAULT_TZ
--------------------------------------------------
UTC_TZ
--------------------------------------------------
24-MAR-15 07.08.24.000000000
24-MAR-15 07.08.24.000000000 AMERICA/NEW_YORK
24-MAR-15 07.08.24.000000000 UTC
Zakładam, że Z jest stałe, a wartości, które otrzymujesz, zawsze reprezentują czas UTC; jeśli rzeczywiście otrzymujesz różne strefy czasowe w wartościach, które chcesz przekonwertować, musisz je wyodrębnić i zastosować – co jest wykonalne, ale trudne i nie warte zagłębiania się, chyba że faktycznie masz taką sytuację.