Tem um pouco de confusão na sua pergunta:
- uma
Datedatatype não salva o componente de fuso horário. Esta informação é truncada e perdida para sempre quando você insere umTIMESTAMP WITH TIME ZONEem umaDate. - Quando você deseja exibir uma data, seja na tela ou para enviá-la para outro sistema por meio de uma API de caracteres (XML, arquivo...), você usa o
TO_CHARfunção. No Oracle, umaDatenão tem formato :é um ponto no tempo. - Reciprocamente, você usaria
TO_TIMESTAMP_TZpara converter umVARCHAR2para umTIMESTAMP, mas isso não converterá umaDatepara umTIMESTAMP. - Você usa
FROM_TZpara adicionar as informações de fuso horário a umTIMESTAMP(ou umaDate). - No Oracle,
CSTé um fuso horário, masCDTnão é.CDTé uma informação de horário de verão. - Para complicar ainda mais,
CST/CDT(-05:00) eCST/CST(-06:00) terá valores diferentes obviamente, mas o fuso horárioCSTherdará as informações de horário de verão dependendo da data por padrão.
Portanto, sua conversão pode não ser tão simples quanto parece.
Supondo que você deseja converter uma
Date d que você sabe que é válido no fuso horário CST/CST para o equivalente no fuso horário CST/CDT , você usaria: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
Meu formato de carimbo de data/hora padrão foi usado aqui. Eu posso especificar um formato explicitamente:
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