Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Instrução e condições de consulta Oracle SQL com carimbos de data/hora e datas ISO


Com base em uma pergunta anterior , é tentador tratar T e Z como literais de caracteres e basicamente ignorá-los, usando:
to_timestamp_tz('2014-01-28T12:00:0Z', 'YYYY-MM-DD"T"HH24:MI:SS"Z"')

Se você usar to_timestamp_tz() sem especificar um fuso horário, o padrão é o fuso horário da sua sessão, assim como to_timestamp(); então um horário especificado em Zulu/UTC perde essa informação 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                       

Seu horário de 12:00 é mostrado como 12:00 em Nova York, não 12:00 UTC.

Uma conversão mais segura, supondo que seus valores sempre representem UTC, é especificar o fuso horário explicitamente com o from_tz() função :
WHERE MODIFICATION_DATE >= from_tz(to_timestamp('2014-01-28T12:00:0Z',
  'YYYY-MM-DD"T"HH24:MI:SS"Z"'), 'UTC')

Isso obtém a hora UTC corretamente:
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