Oracle
 sql >> Database >  >> RDS >> Oracle

Istruzione e condizioni di query Oracle SQL con timestamp e date ISO

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