Pesquisar
Close this search box.

SYSDATE x CURRENT_DATE no Oracle

SYSDATE é uma função SQL que retorna a data e hora atuais definidas para o sistema operacional do servidor de banco de dados . 

CURRENT_DATE retorna a data atual no fuso horário da sessão.

A mesma história se aplica a SYSTIMESTAMP e CURRENT_TIMESTAMP .

Quando os servidores de banco de dados e de aplicativos estão configurados para o mesmo fuso horário, ambas as funções retornarão o mesmo valor, portanto, não importa qual função é usada no código SQL do aplicativo. No exemplo a seguir, tanto o cliente SQL quanto o servidor de banco de dados estão no fuso horário da America/Sao_Paulo, que é duas horas antes do UTC no verão. Mesmo que eu não possa chamar isso de verão quando se trata da Alemanha.

alter session set NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS';
set lines 300
col sysdate for a25
col current_date for a25
col systimestamp for a40
col current_timestamp for a40

SQL> select sysdate, current_date from dual;
SQL> select systimestamp, current_timestamp from dual;

Portanto, ambos os valores mostram 14h17.

Agora, o que acontece quando migramos o banco de dados para um servidor em um fuso horário diferente, por exemplo, UTC?

SYSDATE e SYSTIMESTAMP mostram 17:23, pois o sistema operacional onde o banco de dados é executado está configurado para UTC.

Agora, se seu aplicativo estiver usando SYSDATE ou SYSTIMESTAMP, mas espera obter a hora local, você está com problemas!

Solução recomendada

Se você espera obter a hora local do cliente do banco de dados, use sempre CURRENT_DATE e CURRENT_TIMESTAMP. Isso torna seu aplicativo independente do fuso horário em que o servidor de banco de dados é executado. No entanto, para aplicativos existentes, isso significa que é necessário alterar o código do aplicativo.

O Oracle Autonomous Database fornece o parâmetro init SYSDATE_AT_DBTIMEZONE que permite tratamento especial em uma sessão para o valor de data e hora retornado em chamadas para  SYSDATE e  SYSTIMESTAMP.

Alternativas?

Alterar o fuso horário do banco de dados

Isso não ajudaria!!!

Fuso horário do banco de dados e fuso horário da sessão são conceitos diferentes. Definir o fuso horário do banco de dados altera apenas a forma como as informações de horário são armazenadas para alguns tipos de dados, como TIMESTAMP WITH LOCAL TIMEZONE.

SQL> select dbtimezone from dual;

   DBTIMEZONE
_____________
+00:00
 
SQL> alter database  set time_zone = '-03:00';
 
Database altered.
 
-- restart the database
 
SQL> select dbtimezone from dual;
 
      DBTIMEZONE
________________
-03:00
 
SQL> select sysdate, current_date from dual;
SQL> select systimestamp, current_timestamp from dual;

SYSDATE e SYSTIMESTAMP ainda retornam a hora UTC, entretanto 17:29.

plugins premium WordPress
Abrir bate-papo
1
💬 Precisa de ajuda?
Olá
Podemos ajudá-lo?