Sulla base di una domanda precedente , si è tentati di trattare sia la T che la Z come caratteri letterali e sostanzialmente ignorarli, utilizzando:
to_timestamp_tz('2014-01-28T12:00:0Z', 'YYYY-MM-DD"T"HH24:MI:SS"Z"')
Se usi to_timestamp_tz()
senza specificare un fuso orario, per impostazione predefinita viene impostato il fuso orario della sessione, come farebbe to_timestamp()
; quindi un'ora specificata in Zulu/UTC perde le informazioni sulla zona:
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
Le tue 12:00 vengono visualizzate come 12:00 a New York, non 12:00 UTC.
Una conversione più sicura, supponendo che i tuoi valori debbano sempre rappresentare l'UTC, consiste nello specificare esplicitamente il fuso orario con il from_tz()
funzione
:
WHERE MODIFICATION_DATE >= from_tz(to_timestamp('2014-01-28T12:00:0Z',
'YYYY-MM-DD"T"HH24:MI:SS"Z"'), 'UTC')
Questo ottiene correttamente l'ora 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