C'è un po' di confusione nella tua domanda:
- a
Datedatatype non salva il componente del fuso orario. Questa informazione viene troncata e persa per sempre quando inserisci unTIMESTAMP WITH TIME ZONEin unaDate. - Quando vuoi visualizzare una data, sullo schermo o inviarla a un altro sistema tramite un'API di caratteri (XML, file...), usi
TO_CHARfunzione. In Oracle, unaDatenon ha formato :è un punto nel tempo. - Reciprocamente, useresti
TO_TIMESTAMP_TZper convertire unVARCHAR2a unTIMESTAMP, ma questo non convertirà unaDatea unTIMESTAMP. - Usi
FROM_TZper aggiungere le informazioni sul fuso orario a unTIMESTAMP(o unaDate). - In Oracle,
CSTè un fuso orario maCDTnon è.CDTè un'informazione sull'ora legale. - Per complicare ulteriormente le cose,
CST/CDT(-05:00) eCST/CST(-06:00) avrà ovviamente valori diversi, ma il fuso orarioCSTerediterà le informazioni sull'ora legale in base alla data per impostazione predefinita.
Quindi la tua conversione potrebbe non essere così semplice come sembra.
Supponendo che tu voglia convertire una Date d che sai è valido nel fuso orario CST/CST all'equivalente del fuso orario CST/CDT , useresti:
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
Il mio formato di timestamp predefinito è stato utilizzato qui. Posso specificare un formato in modo esplicito:
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