Функция Java возвращает количество миллисекунд, прошедших с определенного момента времени. Это время полночь первого дня UTC 1970 года, то есть время начала часов 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 () .