Въз основа на предишен въпрос , е изкушаващо да се третират както T, така и Z като символни литерали и основно да се игнорират, като се използва:
to_timestamp_tz('2014-01-28T12:00:0Z', 'YYYY-MM-DD"T"HH24:MI:SS"Z"')
Ако използвате to_timestamp_tz()
без да посочвате часова зона, тогава по подразбиране е часовата зона на вашата сесия, както би to_timestamp()
; така че час, посочен на Zulu/UTC, губи тази информация за зоната:
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
Вашето време в 12:00 се показва като 12:00 в Ню Йорк, а не като 12:00 UTC.
По-безопасно преобразуване, ако се приеме, че вашите стойности винаги трябва да представляват UTC, е да посочите изрично часовата зона с from_tz()
функция
:
WHERE MODIFICATION_DATE >= from_tz(to_timestamp('2014-01-28T12:00:0Z',
'YYYY-MM-DD"T"HH24:MI:SS"Z"'), 'UTC')
Това получава UTC времето правилно:
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