Oracle
 sql >> Base de données >  >> RDS >> Oracle

Instruction et conditions de requête Oracle SQL avec horodatages et dates ISO

Basé sur une question précédente , il est tentant de traiter à la fois le T et le Z comme des caractères littéraux et de les ignorer en utilisant :

to_timestamp_tz('2014-01-28T12:00:0Z', 'YYYY-MM-DD"T"HH24:MI:SS"Z"')

Si vous utilisez to_timestamp_tz() sans spécifier de fuseau horaire, il prend par défaut le fuseau horaire de votre session, comme le ferait to_timestamp(); donc une heure spécifiée en zoulou/UTC perd cette information de zone :

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                       

Votre heure de 12h00 est indiquée comme 12h00 à New York, et non 12h00 UTC.

Une conversion plus sûre, en supposant que vos valeurs sont toujours censées représenter l'UTC, consiste à spécifier explicitement le fuseau horaire avec le from_tz() fonction :

WHERE MODIFICATION_DATE >= from_tz(to_timestamp('2014-01-28T12:00:0Z',
  'YYYY-MM-DD"T"HH24:MI:SS"Z"'), 'UTC')

Cela obtient l'heure UTC correctement :

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