Der er lidt forvirring i dit spørgsmål:
- en
Date
datatype gemmer ikke tidszonekomponenten. Dette stykke information afkortes og går tabt for altid, når du indsætter etTIMESTAMP WITH TIME ZONE
til 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_CHAR
fungere. I Oracle, enDate
har intet format :det er et tidspunkt. - Gensidigt ville du bruge
TO_TIMESTAMP_TZ
at konvertere enVARCHAR2
til enTIMESTAMP
, men dette konverterer ikke enDate
til enTIMESTAMP
. - Du bruger
FROM_TZ
for at tilføje tidszoneoplysningerne til enTIMESTAMP
(eller enDate
). - I Oracle,
CST
er en tidszone, menCDT
er ikke.CDT
er en sommertid information. - For at komplicere tingene yderligere,
CST/CDT
(-05:00
) ogCST/CST
(-06:00
) vil naturligvis have forskellige værdier, men tidszonenCST
vil 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