W Twoim pytaniu jest trochę zamieszania:
Date
datatype nie zapisuje składnika strefy czasowej. Ta informacja jest obcinana i tracona na zawsze po wstawieniuTIMESTAMP WITH TIME ZONE
naDate
.- Gdy chcesz wyświetlić datę, na ekranie lub wysłać ją do innego systemu za pomocą znakowego API (XML, plik...), użyj
TO_CHAR
funkcjonować. W OracleDate
nie ma formatu :to jest punkt w czasie. - Odwrotnie, użyjesz
TO_TIMESTAMP_TZ
przekonwertowaćVARCHAR2
doTIMESTAMP
, ale to nie spowoduje konwersjiDate
doTIMESTAMP
. - Używasz
FROM_TZ
aby dodać informacje o strefie czasowej doTIMESTAMP
(lubDate
). - W Oracle
CST
to strefa czasowa, aleCDT
nie jest.CDT
to 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 czasowaCST
domyś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