De Java-functie retourneert het aantal milliseconden dat is verstreken sinds een vast moment in de tijd. Die tijd is middernacht op de eerste dag van 1970 UTC, d.w.z. het begin van de Unix-kloktijd.
De volgende functie doet hetzelfde voor PL/SQL. Het trekt de huidige tijdstempel af van het startpunt (waarbij ms=1). Het extraheert de verschillende tijdcomponenten en zet ze om in seconden. Ten slotte vermenigvuldigt het alles met 1000 om de waarde in milliseconden te krijgen:
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;
/
Als u Java in de database hebt ingeschakeld, is het wellicht eenvoudiger om in plaats daarvan een Java Stored Procedure te maken:
create or replace function currentTimeMillis return number as
language java name 'java.lang.System.currentTimeMillis() return java.lang.Integer';
/
Vergelijking van de twee benaderingen:
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>
(Mijn dank gaat uit naar Simon Nickerson, die de typfout in de vorige versie van mijn PL/SQL-functie ontdekte, die een abnormaal resultaat opleverde.)
Overigens, als je alleen geïnteresseerd bent in tijd tot op de centiseconde, Oracle heeft daar een ingebouwde functie voor:DBMS_UTILITY.GET_TIME() .