Oracle
 sql >> Database >  >> RDS >> Oracle

Tipo di dati Oracle Date, trasformato in 'AAAA-MM-GG HH24:MI:SS TMZ' tramite SQL

C'è un po' di confusione nella tua domanda:

  • a Date datatype non salva il componente del fuso orario. Questa informazione viene troncata e persa per sempre quando inserisci un TIMESTAMP WITH TIME ZONE in una Date .
  • Quando vuoi visualizzare una data, sullo schermo o inviarla a un altro sistema tramite un'API di caratteri (XML, file...), usi TO_CHAR funzione. In Oracle, una Date non ha formato :è un punto nel tempo.
  • Reciprocamente, useresti TO_TIMESTAMP_TZ per convertire un VARCHAR2 a un TIMESTAMP , ma questo non convertirà una Date a un TIMESTAMP .
  • Usi FROM_TZ per aggiungere le informazioni sul fuso orario a un TIMESTAMP (o una Date ).
  • In Oracle, CST è un fuso orario ma CDT non è. CDT è un'informazione sull'ora legale.
  • Per complicare ulteriormente le cose, CST/CDT (-05:00 ) e CST/CST (-06:00 ) avrà ovviamente valori diversi, ma il fuso orario CST erediterà le informazioni sull'ora legale in base alla data per impostazione predefinita.

Quindi la tua conversione potrebbe non essere così semplice come sembra.

Supponendo che tu voglia convertire una Date d che sai è valido nel fuso orario CST/CST all'equivalente del fuso orario CST/CDT , useresti:

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

Il mio formato di timestamp predefinito è stato utilizzato qui. Posso specificare un formato in modo esplicito:

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