sql >> Databáze >  >> RDS >> Oracle

Datatyp Oracle Date, transformovaný na 'YYYY-MM-DD HH24:MI:SS TMZ' prostřednictvím SQL

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žíte TIMESTAMP WITH TIME ZONE do Date .
  • 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 a Date nemá žádný formát :je to bod v čase.
  • Recipročně byste použili TO_TIMESTAMP_TZ pro převod VARCHAR2 na TIMESTAMP , ale toto nepřevede Date na TIMESTAMP .
  • Používáte FROM_TZ pro přidání informací o časovém pásmu do TIMESTAMP (nebo Date ).
  • V Oracle CST je časové pásmo, ale CDT není. CDT je informace o letním čase.
  • Aby se to ještě více zkomplikovalo, CST/CDT (-05:00 ) a CST/CST (-06:00 ) bude mít samozřejmě jiné hodnoty, ale časové pásmo CST 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


  1. Úroveň izolace bez závazku čtení

  2. SQL:BETWEEN vs <=a>=

  3. Chyba při aktualizaci připojení

  4. Příklady LOG() v SQL Server