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.