Diferença entre Current_Date e Sysdate no Oracle
No Oracle existem algumas unções conhecidas com built-in. Essas funções são funções pré-definidas pelo RDBMS Oracle, ou seja não necessitam ser implementadas manualmente pelo usuário.
Dentre as funções Built-in mais conhecidas temos as funções numéricas como SUM, AVG, VARIANCE, STDDEV, MOD e muitas outras funções capazes de ajudar na manipulação de caracteres numéricos.
Existem também as funções gerais e de strings que são utilizadas, respectivamente para manipular valores nulos e string de caracteres.
Mas neste artigo iremos tratar á respeito de funções de Data e hora, mas especificamente das funções CURRENT_DATE e SYSDATE.
Esses dias me deparei com a possibilidade de utilizar a função CURRENT_DATE,sendo que estou acostumado a utilizar a função SYSDATE, então para entender a diferença entre as duas realizei a seguinte consulta no banco:
SELECT CURRENT_DATE, SYSDATE
FROM dual;
E o resultado foi diferente, mas como, se as duas implicam em retornar a data e hora correntes?
O motivo se deve ao fato de:
A função CURRENT_DATE pega a data e hora de acordo com o TIME ZONE da sessão que está a utilizando, de acordo com os padrões configurados pela localização do DB da sessão.
Já o Sysdate pega a data e hora de acordo com o Servidor Oracle.
Como amenizar as chances de diferenças??
Para poder deixar as duas funções com os mesmos dados de retorno, basta alterar a sessão corrente utilizando o com ALTER e igualar o TIME_ZONE ao TIME_ZONE do BD, dessa forma:
ALTER SESSION SET time_zone = dbtimezone;
Mas realizando a conulta novamente, veremos que ainda os valores continuam diferentes em se tratando da hora:
SELECT current_date, SYSDATE
FROM dual;
--> 05.12.2013 13:30:50 //// 05.12.2013 14:30:49
Então devemos configurar a sessão para que o horário também seja o mesmo que o do TZ do BD, dessa forma:
ALTER SESSION SET time_zone = 'Brasil/East';
No meu caso seria Brazil/East, mas você, leitor, pode estar em outro time_zone nesse caso, digite a consulta a baixo para ver os nomes de TZ possiveis:
SELECT TZABBREV, TZNAME
FROM V$TIMEZONE_NAMES;
Por fim, para analizar se está correto o retorno das duas funções consulte de novo:
SELECT current_date, SYSDATE
FROM dual;
05.12.2013 14:32:51 // 05.12.2013 14:32:51
Considerações Finais
Feito dessa forma, teoricamente não se terá problemas em usar tanto uma quanto a outra função, mas é aconselhável que se utilize a função SYSDATE, afim de que, não haja possibilidade de se confundir, a não ser que seja um caso específico.