Hay un poco de confusión en tu pregunta:
- una
Datetipo de datos no guarda el componente de zona horaria. Esta información se trunca y se pierde para siempre cuando inserta unTIMESTAMP WITH TIME ZONEen 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_CHARfunción. En Oracle, unaDateno tiene formato :es un punto en el tiempo. - Recíprocamente, usaría
TO_TIMESTAMP_TZpara convertir unVARCHAR2a unTIMESTAMP, pero esto no convertirá unaDatea unTIMESTAMP. - Usas
FROM_TZpara agregar la información de la zona horaria a unTIMESTAMP(o unaDate). - En Oracle,
CSTes una zona horaria peroCDTno es.CDTes 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 horariaCSTheredará 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