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.