Эквивалент Oracle для Java System.currentTimeMillis ()? - PullRequest
12 голосов
/ 13 мая 2010

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

select systimestamp from dual; 

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

Ответы [ 4 ]

9 голосов
/ 13 мая 2010

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

2 голосов
/ 28 апреля 2014

эта ссылка помогает для всех языков currentmillis.com для оракула:

SELECT (SYSDATE - TO_DATE('01-01-1970 00:00:00', 'DD-MM-YYYY HH24:MI:SS')) * 24 * 60 * 60 * 1000 FROM DUAL
1 голос
/ 30 августа 2011
  • БД, независимый от часового пояса
  • с миллисекундами
  • работает в XE
    function current_time_ms
        return number
    is
        out_result number;
    begin
        select extract(day from(sys_extract_utc(systimestamp) - to_timestamp('1970-01-01', 'YYYY-MM-DD'))) * 86400000 
            + to_number(to_char(sys_extract_utc(systimestamp), 'SSSSSFF3'))
        into out_result
        from dual;
        return out_result;
    end current_time_ms;
0 голосов
/ 04 июля 2018

Попробуйте это -

выбор извлечения (день от (sys_extract_utc (systimestamp AT TIME ZONE 'GMT') - to_timestamp ('1970-01-01', 'YYYY-MM-DD'))) * 86400000 + to_number (to_char (sys_extract_utc (systimestamp AT TIME ZONE 'GMT'), 'SSSSSFF3')) от двойного;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...