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

¿Oracle equivalente de java System.currentTimeMillis()?

La función Java devuelve el número de milisegundos que han transcurrido desde un momento fijo en el tiempo. Esa hora es la medianoche del primer día de 1970 UTC, es decir, el comienzo de la hora del reloj Unix.

La siguiente función hace lo mismo para PL/SQL. Resta la marca de tiempo actual desde el punto de inicio (donde ms=1). Extrae los diversos componentes del tiempo y los convierte en segundos. Finalmente multiplica todo por 1000 para obtener el valor en milisegundos:

create or replace function current_millisecs 
    return number 
is
    base_point constant timestamp := to_timestamp('01-JAN-1970 00:00:00.000');
    now constant timestamp := systimestamp AT TIME ZONE 'UTC' ;
begin
    return (
                  ((extract(day    from (now-base_point)))*86400)
                + ((extract(hour   from (now-base_point)))*3600)
                + ((extract(minute from (now-base_point)))*60)
                + ((extract(second from (now-base_point))))
           ) * 1000;
end;
/

Si tiene Java habilitado en la base de datos, puede que le resulte más sencillo crear un procedimiento almacenado de Java en su lugar:

create or replace function currentTimeMillis return number as
language java name 'java.lang.System.currentTimeMillis() return java.lang.Integer';
/

Comparación de los dos enfoques:

SQL> select currentTimeMillis as JAVA
  2         , current_millisecs as PLSQL
  3         , currentTimeMillis - current_millisecs as DIFF
  4  from dual
  5  /

      JAVA      PLSQL       DIFF
---------- ---------- ----------
1.2738E+12 1.2738E+12          0

SQL>

(Mi agradecimiento a Simon Nickerson, quien detectó el error tipográfico en la versión anterior de mi función PL/SQL que produjo un resultado anómalo).

Por cierto, si solo está interesado en el tiempo al centisegundo más cercano, Oracle tiene un incorporado para eso:DBMS_UTILITY.GET_TIME() .