Hay un poco de confusión en tu pregunta:
- una
Date
tipo de datos no guarda el componente de zona horaria. Esta información se trunca y se pierde para siempre cuando inserta unTIMESTAMP WITH TIME ZONE
en unaDate
. - Cuando desee mostrar una fecha, ya sea en pantalla o para enviarla a otro sistema a través de una API de caracteres (XML, archivo...), use el
TO_CHAR
función. En Oracle, unaDate
no tiene formato :es un punto en el tiempo. - Recíprocamente, usaría
TO_TIMESTAMP_TZ
para convertir unVARCHAR2
a unTIMESTAMP
, pero esto no convertirá unaDate
a unTIMESTAMP
. - Usas
FROM_TZ
para agregar la información de la zona horaria a unTIMESTAMP
(o unaDate
). - En Oracle,
CST
es una zona horaria peroCDT
no es.CDT
es una información de horario de verano. - Para complicar aún más las cosas,
CST/CDT
(-05:00
) yCST/CST
(-06:00
) tendrá valores diferentes obviamente, pero la zona horariaCST
heredará la información de horario de verano dependiendo de la fecha por defecto.
Por lo tanto, es posible que su conversión no sea tan simple como parece.
Suponiendo que desea convertir una Date
d
que sabes que es válido en la zona horaria CST/CST
al equivalente en la zona horaria CST/CDT
, usarías:
SQL> SELECT from_tz(d, '-06:00') initial_ts,
2 from_tz(d, '-06:00') at time zone ('-05:00') converted_ts
3 FROM (SELECT cast(to_date('2012-10-09 01:10:21',
4 'yyyy-mm-dd hh24:mi:ss') as timestamp) d
5 FROM dual);
INITIAL_TS CONVERTED_TS
------------------------------- -------------------------------
09/10/12 01:10:21,000000 -06:00 09/10/12 02:10:21,000000 -05:00
Mi formato de marca de tiempo predeterminado se ha utilizado aquí. Puedo especificar un formato explícitamente:
SQL> SELECT to_char(from_tz(d, '-06:00'),'yyyy-mm-dd hh24:mi:ss TZR') initial_ts,
2 to_char(from_tz(d, '-06:00') at time zone ('-05:00'),
3 'yyyy-mm-dd hh24:mi:ss TZR') converted_ts
4 FROM (SELECT cast(to_date('2012-10-09 01:10:21',
5 'yyyy-mm-dd hh24:mi:ss') as timestamp) d
6 FROM dual);
INITIAL_TS CONVERTED_TS
------------------------------- -------------------------------
2012-10-09 01:10:21 -06:00 2012-10-09 02:10:21 -05:00