Има малко объркване във вашия въпрос:
- a
Dateтипът данни не запазва компонента на часовата зона. Тази част от информацията се съкращава и се губи завинаги, когато вмъкнетеTIMESTAMP WITH TIME ZONEвDate. - Когато искате да покажете дата на екрана или да я изпратите до друга система чрез API за символи (XML, файл...), използвате
TO_CHARфункция. В Oracle, aDateняма формата :това е момент във времето. - Взаимно ще използвате
TO_TIMESTAMP_TZза да конвертиратеVARCHAR2къмTIMESTAMP, но това няма да преобразуваDateкъмTIMESTAMP. - Използвате
FROM_TZза да добавите информацията за часовата зона къмTIMESTAMP(илиDate). - В Oracle,
CSTе часова зона, ноCDTне е.CDTе информация за лятното часово време. - За да усложните допълнително нещата,
CST/CDT(-05:00) иCST/CST(-06:00) очевидно ще има различни стойности, но часовата зонаCSTще наследи информацията за лятното часово време в зависимост от датата по подразбиране.
Така че преобразуването ви може да не е толкова просто, колкото изглежда.
Ако приемем, че искате да конвертирате Date d което знаете, че е валидно в часова зона CST/CST до еквивалента във часова зона CST/CDT , бихте използвали:
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
Тук е използван моят формат на времеви отпечатък по подразбиране. Мога да посоча изрично формат:
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