sql >> Base de Datos >  >> RDS >> Oracle

Cree una función para devolver la fecha y hora actuales en Oracle

CURRENT_DATE devuelve la fecha y la hora de la sesión. SYSDATE devuelve la fecha y la hora de la base de datos. Estos valores pueden ser diferentes porque podemos cambiar la zona horaria de nuestra sesión usando ALTER SESSION . Probablemente deberías estar usando SYSDATE porque devuelve un valor consistente, aunque sin conocer el contexto de su negocio es difícil estar seguro.

Por su pregunta, sospecho que no se da cuenta de que las pseudocolumnas de fecha de Oracle incluyen un elemento de tiempo. Prueba esto:

alter session set nls_date_format='dd-mon-yyyy hh24Lmi:ss'
/
select current_date from dual
/
select sysdate from dual
/

No tiene mucho sentido envolver una de esas pseudocolumnas en su propia función definida por el usuario. La única vez que lo consideré seriamente fue para facilitar la inyección de tiempos en algunas pruebas unitarias automatizadas. Pero nunca me convencí de que esta instalación justificaría no usar el enfoque estándar.

editar

La solución en la respuesta aceptada funciona pero tiene mucho equipaje innecesario. Todo ese PL/SQL adicional se ejecuta de 2 a 3 veces más lento que un select sysdate from dual; directo . Es cierto que estas son diferencias muy pequeñas en términos absolutos, milisegundos, si es eso. Pero en un sistema ocupado con muchas llamadas a getSysdate() todos esos milisegundos podrían sumar una gran cantidad de tiempo. Una mejor solución sería reemplazar todo ese código con un simple return sysdate; Esto es un poco más lento que llamar a sysdate directamente pero solo un poco.

Ampliando el comentario de dpbradley, elaboré una función que nos permite sustituir una hora de reloj diferente de la base de datos, con fines de prueba. Estoy almacenando mi fecha y hora alternativa en el espacio de nombres CLIENT_INFO en el contexto predeterminado; si estuviera implementando esto en un sistema de producción, crearía un contexto definido por el usuario dedicado para él.

Así que aquí está mi opinión sobre getSysdate() función...

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> 

Así es como establecemos la fecha y hora alternativa...

SQL> exec dbms_application_info.set_client_info('01-DEC-2010 12:12:12')

PL/SQL procedure successfully completed.

Si no se pasa ningún parámetro, devuelve sysdate (la opción predeterminada y preferida).

SQL> select getsysdate from dual
  2  /

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

SQL> 

Si pasamos un espacio de nombres de contexto cuando llamamos a la función, obtenemos la fecha y hora alternativa....

SQL> select mygetsysdate('CLIENT_INFO') from dual
  2  /

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

SQL>