Oracle equaivalent java System.currentTimeMillis ()?

Я хочу смочь сохранить текущее время в миллисекундах в числовом поле Oracle. Как я делаю это через запрос?

select systimestamp from dual; 

возвращает фактическую метку времени. Есть ли так или иначе, что я могу преобразовать это в миллисекунды тем же путем Java System.currentTimeMillis() ?

12
задан APC 13 May 2010 в 06:30
поделиться

1 ответ

Функция 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().

10
ответ дан 2 December 2019 в 21:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: