Ve vaší otázce je trochu zmatek:
- a
Datedatový typ neukládá komponentu časového pásma. Tato informace bude zkrácena a navždy ztracena, když vložíteTIMESTAMP WITH TIME ZONEdoDate. - 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_CHARfunkce. V Oracle aDatenemá žádný formát :je to bod v čase. - Recipročně byste použili
TO_TIMESTAMP_TZpro převodVARCHAR2naTIMESTAMP, ale toto nepřevedeDatenaTIMESTAMP. - Používáte
FROM_TZpro přidání informací o časovém pásmu doTIMESTAMP(neboDate). - V Oracle
CSTje časové pásmo, aleCDTnení.CDTje 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ásmoCSTzdě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