Има малко объркване във вашия въпрос:
- 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