Na podstawie wcześniejszego pytania , kuszące jest traktowanie zarówno T, jak i Z jako literałów znakowych i w zasadzie ignorowanie ich za pomocą:
to_timestamp_tz('2014-01-28T12:00:0Z', 'YYYY-MM-DD"T"HH24:MI:SS"Z"')
Jeśli używasz to_timestamp_tz()
bez określenia strefy czasowej, domyślnie jest to strefa czasowa sesji, podobnie jak to_timestamp()
; więc czas określony w Zulu/UTC traci informacje o strefie:
alter session set time_zone = 'America/New_York';
select to_timestamp_tz('2014-01-28T12:00:0Z',
'YYYY-MM-DD"T"HH24:MI:SS"Z"') from dual;
TO_TIMESTAMP_TZ('2014-01-28T12:00:0Z','YYYY-MM-DD"T"HH24:MI:SS"Z"')
-------------------------------------------------------------------
28-JAN-14 12.00.00.000000000 AMERICA/NEW_YORK
Twoja godzina 12:00 jest wyświetlana jako 12:00 w Nowym Jorku, a nie 12:00 UTC.
Bezpieczniejszą konwersją, zakładając, że wartości zawsze mają reprezentować UTC, jest wyraźne określenie strefy czasowej za pomocą from_tz()
funkcja
:
WHERE MODIFICATION_DATE >= from_tz(to_timestamp('2014-01-28T12:00:0Z',
'YYYY-MM-DD"T"HH24:MI:SS"Z"'), 'UTC')
Dzięki temu czas UTC jest poprawnie odczytywany:
alter session set time_zone = 'America/New_York';
select from_tz(to_timestamp('2014-01-28T12:00:0Z',
'YYYY-MM-DD"T"HH24:MI:SS"Z"'), 'UTC') from dual;
FROM_TZ(TO_TIMESTAMP('2014-01-28T12:00:0Z','YYYY-MM-DD"T"HH24:MI:SS"Z"'),'UTC')
-------------------------------------------------------------------------------
28-JAN-14 12.00.00.000000000 UTC