Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Tipo de dados Oracle Date, transformado em 'YYYY-MM-DD HH24:MI:SS TMZ' por meio de SQL


Tem um pouco de confusão na sua pergunta:
  • uma Date datatype não salva o componente de fuso horário. Esta informação é truncada e perdida para sempre quando você insere um TIMESTAMP WITH TIME ZONE em uma Date .
  • Quando você deseja exibir uma data, seja na tela ou para enviá-la para outro sistema por meio de uma API de caracteres (XML, arquivo...), você usa o TO_CHAR função. No Oracle, uma Date não tem formato :é um ponto no tempo.
  • Reciprocamente, você usaria TO_TIMESTAMP_TZ para converter um VARCHAR2 para um TIMESTAMP , mas isso não converterá uma Date para um TIMESTAMP .
  • Você usa FROM_TZ para adicionar as informações de fuso horário a um TIMESTAMP (ou uma Date ).
  • No Oracle, CST é um fuso horário, mas CDT não é. CDT é uma informação de horário de verão.
  • Para complicar ainda mais, CST/CDT (-05:00 ) e CST/CST (-06:00 ) terá valores diferentes obviamente, mas o fuso horário CST herdará as informações de horário de verão dependendo da data por padrão.

Portanto, sua conversão pode não ser tão simples quanto parece.

Supondo que você deseja converter uma Date d que você sabe que é válido no fuso horário CST/CST para o equivalente no fuso horário CST/CDT , você usaria:
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

Meu formato de carimbo de data/hora padrão foi usado aqui. Eu posso especificar um formato explicitamente:
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