Der er lidt forvirring i dit spørgsmål:
- en
Datedatatype gemmer ikke tidszonekomponenten. Dette stykke information afkortes og går tabt for altid, når du indsætter etTIMESTAMP WITH TIME ZONEtil enDate. - Når du vil vise en dato, enten på skærmen eller for at sende den til et andet system via et tegn-API (XML, fil...), bruger du
TO_CHARfungere. I Oracle, enDatehar intet format :det er et tidspunkt. - Gensidigt ville du bruge
TO_TIMESTAMP_TZat konvertere enVARCHAR2til enTIMESTAMP, men dette konverterer ikke enDatetil enTIMESTAMP. - Du bruger
FROM_TZfor at tilføje tidszoneoplysningerne til enTIMESTAMP(eller enDate). - I Oracle,
CSTer en tidszone, menCDTer ikke.CDTer en sommertid information. - For at komplicere tingene yderligere,
CST/CDT(-05:00) ogCST/CST(-06:00) vil naturligvis have forskellige værdier, men tidszonenCSTvil som standard arve sommertid-informationen afhængigt af datoen.
Så din konvertering er muligvis ikke så enkel, som den ser ud.
Forudsat at du vil konvertere en Date d som du ved er gyldig i tidszonen CST/CST til det tilsvarende i tidszonen CST/CDT , ville du bruge:
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
Mit standard tidsstempelformat er blevet brugt her. Jeg kan udtrykkeligt angive et format:
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