Il y a un peu de confusion dans votre question :
- une
Date
Le type de données n'enregistre pas le composant de fuseau horaire. Cette information est tronquée et perdue à jamais lorsque vous insérez unTIMESTAMP WITH TIME ZONE
en uneDate
. - Lorsque vous souhaitez afficher une date, soit à l'écran, soit pour l'envoyer vers un autre système via une API caractère (XML, fichier...), vous utilisez le
TO_CHAR
une fonction. Dans Oracle, uneDate
n'a pas de format :il s'agit d'un point dans le temps. - Réciproquement, vous utiliseriez
TO_TIMESTAMP_TZ
pour convertir unVARCHAR2
à unTIMESTAMP
, mais cela ne convertira pas uneDate
à unTIMESTAMP
. - Vous utilisez
FROM_TZ
pour ajouter les informations de fuseau horaire à unTIMESTAMP
(ou uneDate
). - Dans Oracle,
CST
est un fuseau horaire maisCDT
n'est pas.CDT
est une information sur l'heure d'été. - Pour compliquer davantage les choses,
CST/CDT
(-05:00
) etCST/CST
(-06:00
) aura évidemment des valeurs différentes, mais le fuseau horaireCST
héritera des informations d'heure d'été en fonction de la date par défaut.
Votre conversion n'est donc peut-être pas aussi simple qu'elle en a l'air.
En supposant que vous souhaitiez convertir une Date
d
dont vous savez qu'elle est valide au fuseau horaire CST/CST
à l'équivalent au fuseau horaire CST/CDT
, vous utiliseriez :
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
Mon format d'horodatage par défaut a été utilisé ici. Je peux spécifier un format explicitement :
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