Det är lite förvirring i din fråga:
- ett
Date
datatype sparar inte tidszonskomponenten. Den här informationen trunkeras och går förlorad för alltid när du infogar enTIMESTAMP WITH TIME ZONE
till 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_CHAR
fungera. I Oracle, ettDate
har inget format :det är en tidpunkt. - Ömsesidigt skulle du använda
TO_TIMESTAMP_TZ
för att konvertera enVARCHAR2
till enTIMESTAMP
, men detta konverterar inte ettDate
till enTIMESTAMP
. - Du använder
FROM_TZ
fö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 tidszonenCST
kommer 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