sql >> Base de Datos >  >> RDS >> Oracle

Tipo de datos Oracle Date, transformado a 'YYYY-MM-DD HH24:MI:SS TMZ' a través de SQL

Hay un poco de confusión en tu pregunta:

  • una Date tipo de datos no guarda el componente de zona horaria. Esta información se trunca y se pierde para siempre cuando inserta un TIMESTAMP WITH TIME ZONE en una Date .
  • Cuando desee mostrar una fecha, ya sea en pantalla o para enviarla a otro sistema a través de una API de caracteres (XML, archivo...), use el TO_CHAR función. En Oracle, una Date no tiene formato :es un punto en el tiempo.
  • Recíprocamente, usaría TO_TIMESTAMP_TZ para convertir un VARCHAR2 a un TIMESTAMP , pero esto no convertirá una Date a un TIMESTAMP .
  • Usas FROM_TZ para agregar la información de la zona horaria a un TIMESTAMP (o una Date ).
  • En Oracle, CST es una zona horaria pero CDT no es. CDT es una información de horario de verano.
  • Para complicar aún más las cosas, CST/CDT (-05:00 ) y CST/CST (-06:00 ) tendrá valores diferentes obviamente, pero la zona horaria CST heredará la información de horario de verano dependiendo de la fecha por defecto.

Por lo tanto, es posible que su conversión no sea tan simple como parece.

Suponiendo que desea convertir una Date d que sabes que es válido en la zona horaria CST/CST al equivalente en la zona horaria CST/CDT , usarías:

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

Mi formato de marca de tiempo predeterminado se ha utilizado aquí. Puedo especificar un formato explícitamente:

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