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

Como faço para obter este carimbo de data/hora no formato que desejo, Oracle SQL


Como @Gordon disse, timestamps (e datas) não são armazenados em um formato que você reconheceria que o Oracle usa uma representação interna que você nunca precisa conhecer ou examinar (mas está documentado se você estiver interessado nesse tipo de coisa) .

Quando você consulta um carimbo de data/hora, ele é exibido usando as configurações de NLS do seu cliente, a menos que você tenha um cliente que as substitua. Posso configurar minha sessão para corresponder ao que você está vendo:
alter session set nls_timestamp_format = 'DD-MON-RR HH.MI.SS.FF AM';

select to_char(systimestamp, 'YYYY-MM-DD HH24:MI:SS') from dual;

TO_CHAR(SYSTIMESTAM
-------------------
2018-07-10 15:37:31

select to_timestamp(to_char(systimestamp, 'YYYY-MM-DD HH24:MI:SS'), 'YYYY-MM-DD HH24:MI:SS') from dual;

TO_TIMESTAMP(TO_CHAR(SYSTIMESTA
-------------------------------
10-JUL-18 03.37.31.000000000 PM

E eu posso mudar isso, veja o que você quer ver:
alter session set nls_timestamp_format = 'YYYY-MM-DD HH24:MI:SS';

select to_timestamp(to_char(systimestamp, 'YYYY-MM-DD HH24:MI:SS'), 'YYYY-MM-DD HH24:MI:SS') from dual;

TO_TIMESTAMP(TO_CHA
-------------------
2018-07-10 15:37:32

Mas tudo o que você está fazendo é converter de um timestamp com fuso horário (que é o que systimestamp is) para uma string e depois de volta para um timestamp. Você está perdendo a parte do fuso horário e quaisquer segundos fracionários; o que você também pode fazer com um cast :
select cast(systimestamp as timestamp(0)) from dual;

CAST(SYSTIMESTAMPAS
-------------------
2018-07-10 15:37:32

Você pode ver o fuso horário e a fração de segundos com seu timestamp_tz padrão formato:
select systimestamp from dual;

SYSTIMESTAMP                        
------------------------------------
2018-07-10 15:37:33.776469000 +01:00

e altere-o com um alter diferente :
alter session set nls_timestamp_tz_format = 'YYYY-MM-DD HH24:MI:SS.FF3 TZH:TZM';

select systimestamp from dual;

SYSTIMESTAMP                  
------------------------------
2018-07-10 15:37:34.070 +01:00

O que não é totalmente relevante se você estiver realmente falando sobre armazenar registros de data e hora em uma tabela, mas mostra que existem variações.

Em sua tabela faça o tipo de dados timestamp (ou timestamp with time zone ou timestamp with local time zone ), e só se preocupe em formatar o valor como uma string para apresentação ao usuário final, no último momento possível.

Quando você precisar exibi-lo, se o formato de exibição for importante para você, use to_char() com uma máscara de formato explícito - não assuma que qualquer outra pessoa executando suas consultas terá as mesmas configurações de NLS. Como você pode ver, é fácil alterá-los para modificar a saída. (A maioria dos clientes tem uma maneira de permitir que você defina os padrões para que você não precise fazer o mesmo alter comandos toda vez que você se conectar; por exemplo. no SQL Developer, em Ferramentas->Preferências->Banco de Dados->NLS). Se você quiser sempre mostrar o mesmo formato, use algo como:
select to_char(your_column, 'YYYY-MM-DD HH24:MI:SS') as column_alias
from your_table
where your_column < timestamp '2018-01-01 00:00:00'

que também mostra o valor da coluna sendo filtrado (como um carimbo de data/hora ainda) usando um literal de carimbo de data/hora.