Funkcja Java zwraca liczbę milisekund, które upłynęły od ustalonego momentu w czasie. Czas ten to północ pierwszego dnia 1970 UTC, czyli początek czasu uniksowego.
Poniższa funkcja robi to samo dla PL/SQL. Odejmuje bieżący znacznik czasu od punktu początkowego (gdzie ms=1). Wyodrębnia różne składniki czasu i zamienia je w sekundy. Na koniec mnoży wszystko przez 1000, aby uzyskać wartość w milisekundach:
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;
/
Jeśli masz włączoną obsługę języka Java w bazie danych, może być prostsze utworzenie procedury składowanej Java:
create or replace function currentTimeMillis return number as
language java name 'java.lang.System.currentTimeMillis() return java.lang.Integer';
/
Porównanie dwóch podejść:
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>
(Dziękuję Simonowi Nickersonowi, który zauważył literówkę w poprzedniej wersji mojej funkcji PL/SQL, która dała nietypowy wynik.)
Nawiasem mówiąc, jeśli interesuje Cię czas z dokładnością do najbliższej setnej sekundy, Oracle ma do tego wbudowaną funkcję:DBMS_UTILITY.GET_TIME() .