Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Oracle SQL-Abfrageanweisung und -bedingungen mit Zeitstempeln und ISO-Daten

Basierend auf einer früheren Frage , ist es verlockend, sowohl das T als auch das Z als Zeichenliterale zu behandeln und sie im Grunde zu ignorieren, indem man verwendet:

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

Wenn Sie to_timestamp_tz() verwenden ohne Angabe einer Zeitzone wird standardmäßig Ihre Sitzungszeitzone verwendet, ebenso wie to_timestamp(); eine in Zulu/UTC angegebene Zeit verliert also diese Zoneninformationen:

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                       

Ihre 12:00-Uhrzeit wird in New York als 12:00 angezeigt, nicht als 12:00 UTC.

Eine sicherere Konvertierung, vorausgesetzt, Ihre Werte sollen immer UTC darstellen, besteht darin, die Zeitzone explizit mit der from_tz() Funktion :

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

Dadurch wird die UTC-Zeit korrekt abgerufen:

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