La función Java devuelve la cantidad 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 inicio del horario de reloj de Unix.
La siguiente función hace lo mismo para PL/SQL. Resta la marca de tiempo actual del punto de inicio (donde ms = 1). Extrae los diversos componentes de tiempo y los convierte en segundos. Finalmente se 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 activado Java en la base de datos puede que le resulte más sencillo para crear un procedimiento almacenado Java en su lugar:
create or replace function currentTimeMillis return number as
language java name 'java.lang.System.currentTimeMillis() return java.lang.Integer';
/
Comparativa 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 Simón Nickerson, que descubrió el error tipográfico en la versión anterior de mi función PL/SQL que produjo un resultado anómalo.)
Por cierto, si usted está interesado sólo en el momento de la centisegundo más cercano, Oracle tiene un built-in para ello: DBMS_UTILITY.GET_TIME().
Algunos sugerencias útiles aquí: http://www.dba-oracle.com/t_timestamp_math_elapsed_times.htm –