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

Oracle equivalente a java System.currentTimeMillis()?


A função Java retorna o número de milissegundos decorridos desde um momento fixo no tempo. Essa hora é meia-noite no primeiro dia de 1970 UTC, ou seja, o início do relógio Unix.

A função a seguir faz o mesmo para PL/SQL. Ele subtrai o timestamp atual do ponto inicial (onde ms=1). Extrai os vários componentes de tempo e os transforma em segundos. Por fim, multiplica tudo por 1000 para obter o valor em milissegundos:
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;
/

Se você tiver o Java habilitado no banco de dados, talvez seja mais simples criar um procedimento armazenado Java:
create or replace function currentTimeMillis return number as
language java name 'java.lang.System.currentTimeMillis() return java.lang.Integer';
/

Comparação das duas abordagens:
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>

(Meus agradecimentos vão para Simon Nickerson, que detectou o erro de digitação na versão anterior da minha função PL/SQL que produziu um resultado anômalo.)

Aliás, se você estiver interessado apenas no tempo até o centésimo de segundo mais próximo, a Oracle tem um built-in para isso:DBMS_UTILITY.GET_TIME() .