Функцията Java връща броя милисекунди, които са изминали от фиксиран момент във времето. Това време е полунощ на първия ден от 1970 UTC, т.е. началото на часовника на Unix.
Следната функция прави същото за PL/SQL. Той изважда текущото времево клеймо от началната точка (където ms=1). Той извлича различните компоненти на времето и ги превръща в секунди. Накрая умножава всичко по 1000, за да получи стойността в милисекунди:
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;
/
Ако сте активирали Java в базата данни, може да намерите по-лесно вместо това да създадете съхранена процедура на Java:
create or replace function currentTimeMillis return number as
language java name 'java.lang.System.currentTimeMillis() return java.lang.Integer';
/
Сравнение на двата подхода:
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>
(Моите благодарности отиват на Саймън Никерсън, който забеляза правописната грешка в предишната версия на моята PL/SQL функция, която доведе до аномален резултат.)
Между другото, ако се интересувате само от времето до най-близката сантисекунда, Oracle има вграден за това:DBMS_UTILITY.GET_TIME() .