Oracle
 sql >> Database >  >> RDS >> Oracle

Oracle equivalente a java System.currentTimeMillis()?

La funzione Java restituisce il numero di millisecondi trascorsi da un determinato momento. Quell'ora è la mezzanotte del primo giorno del 1970 UTC, cioè l'inizio dell'ora Unix.

La seguente funzione fa lo stesso per PL/SQL. Sottrae il timestamp corrente dal punto iniziale (dove ms=1). Estrae le varie componenti temporali e le trasforma in secondi. Infine moltiplica tutto per 1000 per ottenere il valore in millisecondi:

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 hai Java abilitato nel database, potresti invece trovare più semplice creare una stored procedure Java:

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

Confronto dei due approcci:

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>

(I miei ringraziamenti vanno a Simon Nickerson, che ha individuato l'errore di battitura nella versione precedente della mia funzione PL/SQL che ha prodotto un risultato anomalo.)

Per inciso, se sei interessato solo al tempo al centisecondo più vicino, Oracle ha un built-in per questo:DBMS_UTILITY.GET_TIME() .