sql >> Base de Datos >  >> RDS >> Oracle

Declaración de consulta Oracle SQL y condiciones con marcas de tiempo y fechas ISO

Basado en una pregunta anterior , es tentador tratar tanto la T como la Z como caracteres literales y básicamente ignorarlos, usando:

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

Si usa to_timestamp_tz() sin especificar una zona horaria, la zona horaria predeterminada es la de su sesión, al igual que to_timestamp(); por lo que una hora especificada en Zulu/UTC pierde esa información de 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                       

Su hora de las 12:00 se muestra como las 12:00 en Nueva York, no como las 12:00 UTC.

Una conversión más segura, suponiendo que sus valores siempre representen UTC, es especificar la zona horaria explícitamente con el from_tz() función :

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

Esto obtiene la hora UTC correctamente:

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