C'è un po' di confusione nella tua domanda:
- a
Date
datatype non salva il componente del fuso orario. Questa informazione viene troncata e persa per sempre quando inserisci unTIMESTAMP WITH TIME ZONE
in unaDate
. - Quando vuoi visualizzare una data, sullo schermo o inviarla a un altro sistema tramite un'API di caratteri (XML, file...), usi
TO_CHAR
funzione. In Oracle, unaDate
non ha formato :è un punto nel tempo. - Reciprocamente, useresti
TO_TIMESTAMP_TZ
per convertire unVARCHAR2
a unTIMESTAMP
, ma questo non convertirà unaDate
a unTIMESTAMP
. - Usi
FROM_TZ
per aggiungere le informazioni sul fuso orario a unTIMESTAMP
(o unaDate
). - In Oracle,
CST
è un fuso orario maCDT
non è.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 orarioCST
erediterà 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