Tem um pouco de confusão na sua pergunta:
- uma
Date
datatype não salva o componente de fuso horário. Esta informação é truncada e perdida para sempre quando você insere umTIMESTAMP WITH TIME ZONE
em 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_CHAR
função. No Oracle, umaDate
não tem formato :é um ponto no tempo. - Reciprocamente, você usaria
TO_TIMESTAMP_TZ
para converter umVARCHAR2
para umTIMESTAMP
, mas isso não converterá umaDate
para umTIMESTAMP
. - Você usa
FROM_TZ
para adicionar as informações de fuso horário a umTIMESTAMP
(ou umaDate
). - No Oracle,
CST
é um fuso horário, masCDT
nã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árioCST
herdará 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