La fonction Java renvoie le nombre de millisecondes qui se sont écoulées depuis un moment fixe dans le temps. Cette heure est minuit le premier jour de 1970 UTC, c'est-à-dire le début de l'heure Unix.
La fonction suivante est la même pour PL/SQL. Il soustrait l'horodatage actuel du point de départ (où ms = 1). Il extrait les différents composants temporels 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 vous pouvez trouver plus simple de créer un Java procédure stockée à la place:
create or replace function currentTimeMillis return number as
language java name 'java.lang.System.currentTimeMillis() return java.lang.Integer';
/
Comparaison des les 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>
(je tiens à remercier Simon Nickerson, qui a repéré la faute de frappe dans la version précédente de ma fonction PL/SQL qui a produit un résultat anormal.)
Soit dit en passant, si vous ne souhaitez que le temps de l'centisecond, Oracle le plus proche a pour intégré qui: DBMS_UTILITY.GET_TIME().
Certains suggestions utiles ici: http://www.dba-oracle.com/t_timestamp_math_elapsed_times.htm –