Ve vaší otázce je trochu zmatek:
- a
Date
datový typ neukládá komponentu časového pásma. Tato informace bude zkrácena a navždy ztracena, když vložíteTIMESTAMP WITH TIME ZONE
doDate
. - Chcete-li zobrazit datum, buď na obrazovce, nebo jej odeslat do jiného systému prostřednictvím znakového API (XML, soubor...), použijte
TO_CHAR
funkce. V Oracle aDate
nemá žádný formát :je to bod v čase. - Recipročně byste použili
TO_TIMESTAMP_TZ
pro převodVARCHAR2
naTIMESTAMP
, ale toto nepřevedeDate
naTIMESTAMP
. - Používáte
FROM_TZ
pro přidání informací o časovém pásmu doTIMESTAMP
(neboDate
). - V Oracle
CST
je časové pásmo, aleCDT
není.CDT
je informace o letním čase. - Aby se to ještě více zkomplikovalo,
CST/CDT
(-05:00
) aCST/CST
(-06:00
) bude mít samozřejmě jiné hodnoty, ale časové pásmoCST
zdědí informace o letním čase v závislosti na datu ve výchozím nastavení.
Vaše konverze tedy nemusí být tak jednoduchá, jak vypadá.
Za předpokladu, že chcete převést Date
d
o kterém víte, že je platný v časovém pásmu CST/CST
na ekvivalent v časovém pásmu CST/CDT
, použili byste:
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
Zde byl použit můj výchozí formát časového razítka. Mohu specifikovat formát explicitně:
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