Det är lite förvirring i din fråga:
- ett
Datedatatype sparar inte tidszonskomponenten. Den här informationen trunkeras och går förlorad för alltid när du infogar enTIMESTAMP WITH TIME ZONEtill ettDate. - När du vill visa ett datum, antingen på skärmen eller för att skicka det till ett annat system via ett tecken-API (XML, fil...), använder du
TO_CHARfungera. I Oracle, ettDatehar inget format :det är en tidpunkt. - Ömsesidigt skulle du använda
TO_TIMESTAMP_TZför att konvertera enVARCHAR2till enTIMESTAMP, men detta konverterar inte ettDatetill enTIMESTAMP. - Du använder
FROM_TZför att lägga till tidszonsinformationen till enTIMESTAMP(eller ettDate). - I Oracle,
CSTär en tidszon menCDTär inte.CDTär en sommartidsinformation. - För att komplicera saker ytterligare,
CST/CDT(-05:00) ochCST/CST(-06:00) kommer att ha olika värden uppenbarligen, men tidszonenCSTkommer att ärva sommartidsinformationen beroende på datum som standard.
Så din konvertering kanske inte är så enkel som den ser ut.
Förutsatt att du vill konvertera ett Date d som du vet är giltig i tidszonen CST/CST till motsvarande i tidszonen CST/CDT , skulle du använda:
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
Mitt standardformat för tidsstämpel har använts här. Jag kan ange ett format uttryckligen:
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