W Twoim pytaniu jest trochę zamieszania:
Datedatatype nie zapisuje składnika strefy czasowej. Ta informacja jest obcinana i tracona na zawsze po wstawieniuTIMESTAMP WITH TIME ZONEnaDate.- Gdy chcesz wyświetlić datę, na ekranie lub wysłać ją do innego systemu za pomocą znakowego API (XML, plik...), użyj
TO_CHARfunkcjonować. W OracleDatenie ma formatu :to jest punkt w czasie. - Odwrotnie, użyjesz
TO_TIMESTAMP_TZprzekonwertowaćVARCHAR2doTIMESTAMP, ale to nie spowoduje konwersjiDatedoTIMESTAMP. - Używasz
FROM_TZaby dodać informacje o strefie czasowej doTIMESTAMP(lubDate). - W Oracle
CSTto strefa czasowa, aleCDTnie jest.CDTto informacja dotycząca czasu letniego. - Aby jeszcze bardziej skomplikować sprawę,
CST/CDT(-05:00) iCST/CST(-06:00) oczywiście będą miały różne wartości, ale strefa czasowaCSTdomyślnie odziedziczy informacje dotyczące czasu letniego w zależności od daty.
Twoja konwersja może nie być tak prosta, jak się wydaje.
Zakładając, że chcesz przekonwertować Date d wiesz, że obowiązuje w strefie czasowej CST/CST do odpowiednika w strefie czasowej CST/CDT , użyjesz:
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
Użyto tutaj mojego domyślnego formatu znacznika czasu. Mogę wyraźnie określić 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