Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Crie uma função para retornar a data e hora atuais no oracle


CURRENT_DATE retorna a data e hora da sessão. SYSDATE retorna a data e hora do banco de dados. Esses valores podem ser diferentes porque podemos alterar o fuso horário da nossa sessão usando ALTER SESSION . Você provavelmente deveria estar usando SYSDATE porque retorna um valor consistente, embora sem conhecer o contexto do seu negócio seja difícil ter certeza.

Pela sua pergunta, suspeito que você não perceba que as pseudocolunas de data do Oracle incluem um elemento de tempo. Tente isto:
alter session set nls_date_format='dd-mon-yyyy hh24Lmi:ss'
/
select current_date from dual
/
select sysdate from dual
/

Não há muito sentido em envolver uma dessas pseudocolunas em sua própria função definida pelo usuário. A única vez que considerei seriamente isso foi para facilitar a injeção de tempos em alguns testes de unidade automatizados. Mas nunca me convenci de que essa facilidade justificaria não usar a abordagem padrão.

editar

A solução na resposta aceita funciona, mas tem muita bagagem desnecessária. Todo esse PL/SQL adicional é executado 2-3 vezes mais lento que um select sysdate from dual; direto . É verdade que essas são diferenças muito pequenas em termos absolutos - milissegundos, se tanto. Mas em um sistema ocupado com muitas chamadas para getSysdate() todos esses milissegundos poderiam somar uma grande quantidade de tempo. Uma solução melhor seria substituir todo esse código por um simples return sysdate; Isso é um pouco mais lento do que chamar sysdate diretamente, mas apenas um pouco.

Expandindo o comentário de dpbradley, criei uma função que nos permite substituir um horário diferente do banco de dados, para fins de teste. Estou armazenando meu datetime alternativo no namespace CLIENT_INFO no contexto padrão; se eu estivesse implementando isso em um sistema de produção, construiria um contexto definido pelo usuário dedicado para ele.

Então aqui está minha opinião sobre o getSysdate() função...
SQL> create or replace function myGetSysdate
  2      ( p_alt_date in varchar2 := null )
  3  return date is
  4  begin
  5      if p_alt_date is null then
  6          return sysdate;
  7      else
  8          return to_date(sys_context('userenv', p_alt_date)
  9                                        , 'dd-mon-yyyy hh24:mi:ss');
 10      end if;
 11  end;
 12  /

Function created.

SQL> 

Aqui está como definimos o datetime alternativo ...
SQL> exec dbms_application_info.set_client_info('01-DEC-2010 12:12:12')

PL/SQL procedure successfully completed.

Se nenhum parâmetro for passado, ele retornará sysdate (a opção padrão e preferida).
SQL> select getsysdate from dual
  2  /

GETSYSDATE
-----------------
05-JAN-2010 16:25

SQL> 

Se passarmos um namespace de contexto quando chamamos a função, obtemos o datetime alternativo....
SQL> select mygetsysdate('CLIENT_INFO') from dual
  2  /

MYGETSYSDATE('CLI
-----------------
01-DEC-2010 12:12

SQL>