Oracle
 sql >> Base de données >  >> RDS >> Oracle

Équivalent Oracle de java System.currentTimeMillis() ?

La fonction Java renvoie le nombre de millisecondes qui se sont écoulées depuis un instant fixe. Cette heure est minuit le premier jour de 1970 UTC, c'est-à-dire le début de l'horloge Unix.

La fonction suivante fait la même chose pour PL/SQL. Il soustrait l'horodatage actuel du point de départ (où ms=1). Il extrait les différentes composantes temporelles et les transforme en secondes. Enfin il multiplie tout par 1000 pour obtenir la valeur en millisecondes :

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 Java est activé dans la base de données, il peut être plus simple de créer une procédure stockée Java à la place :

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

Comparaison des deux approches :

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>

(Mes remerciements vont à Simon Nickerson, qui a repéré la faute de frappe dans la version précédente de ma fonction PL/SQL qui produisait un résultat anormal.)

Incidemment, si vous n'êtes intéressé que par le temps à la centiseconde près, Oracle dispose d'un outil intégré pour cela :DBMS_UTILITY.GET_TIME() .