O PolarDB for PostgreSQL (Compatible with Oracle) oferece suporte a tipos DATE de 64 bits compatíveis com o Oracle. Se você estiver migrando aplicações do Oracle para o PolarDB, compreender essas diferenças de comportamento ajudará a evitar perda de precisão dos dados e erros na aplicação.
Pré-requisitos
Antes de começar, verifique se você tem:
Um cluster executando a versão secundária V1.1.29 (lançada em dezembro de 2022) ou posterior. Somente novos clusters oferecem suporte a tipos DATE de 64 bits. Clusters existentes não têm esse suporte.
Driver JDBC do PolarDB versão 42.2.9.1.2 ou posterior. O uso de uma versão mais antiga do driver pode causar perda de precisão. Para obter instruções de download e informações sobre versões, consulte JDBC.
Diferenças de comportamento em relação à versão anterior
A implementação de DATE de 64 bits altera dois comportamentos em comparação à versão anterior. Analise essas mudanças antes de migrar aplicações existentes.
Tipo de resultado da subtração de DATE
Na nova versão, a subtração de dois valores DATE retorna um valor NUMERIC. Na versão anterior, o resultado era um INTERVAL.
Versão anterior — retorna INTERVAL:
select pg_typeof(sysdate - sysdate) from dual;
pg_typeof
-----------
interval
(1 row)
Nova versão — retorna NUMERIC:
select pg_typeof(sysdate - sysdate) from dual;
pg_typeof
-----------
numeric
(1 row)
Se sua aplicação processa resultados de subtração de DATE como um tipo INTERVAL, atualize o código para lidar com valores NUMERIC antes de migrar para esta versão.
Truncamento de precisão
O tipo DATE de 64 bits armazena datas com resolução de 1 segundo. Valores de entrada com precisão inferior a um segundo são truncados para o segundo mais próximo.
Versão anterior — a precisão inferior a um segundo é preservada:
select to_date('2021-10-31 10:31:31.7777') - to_date('2021-10-31 10:31:31') from dual;
?column?
---------------
00:00:00.7777
(1 row)
Nova versão — a precisão inferior a um segundo é truncada:
select to_date('2021-10-31 10:31:31.7777') - to_date('2021-10-31 10:31:31') from dual;
?column?
----------
0
(1 row)
Se sua aplicação depender de precisão inferior a um segundo em valores DATE, use o tipo TIMESTAMP, que oferece suporte a precisão de até microssegundos.
Controle do formato de exibição
Defina o parâmetro nls_date_format para controlar como os valores DATE são exibidos.
Exemplo: formato separado por barras
set nls_date_format = 'yyyy/mm/dd hh24:mi:ss';
select sysdate from dual;
sysdate
---------------------
2022/12/06 09:13:59
(1 row)
Exemplo: formato separado por hifens
set nls_date_format = 'yyyy-mm-dd hh24:mi:ss';
select sysdate from dual;
sysdate
---------------------
2022-12-06 09:14:31
(1 row)