Подтвердить что ты не робот

Oracle systimestamp (sysdate) до миллисекунд

Не могли бы вы обеспечить реализацию хранимой функции для получения текущего systimestamp в миллисекундах.
Что-то, что я могу использовать, например

select current_time_ms from dual;

и получить разницу, измеренную в миллисекундах, между текущим временем и полночью, 1 января 1970 г. UTC.

Спасибо.

4b9b3361

Ответ 1

  • Атрибут временной шкалы DB
  • с миллисекундами
  • работает в 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;

Ответ 2

Лучшее, что я знаю, это:

select extract(day    from (systimestamp - timestamp '1970-01-01 00:00:00')) * 86400000
     + extract(hour   from (systimestamp - timestamp '1970-01-01 00:00:00')) * 3600000
     + extract(minute from (systimestamp - timestamp '1970-01-01 00:00:00')) * 60000
     + extract(second from (systimestamp - timestamp '1970-01-01 00:00:00')) * 1000 unix_time
from dual;

Я не совсем уверен, какие у вас требования относительно часового пояса. Возможно, вам придется внести небольшие корректировки.

Ответ 3

Добавление к ответу @Mykhaylo Adamovych (который выглядит правильно!) здесь имеет более простой подход с использованием поддержки Java oracle (т.е. не в XE, а не в AWS RDS). Меньше переносимости (в случае, если вы заботитесь), но, казалось, быстрее в моем тестировании.

CREATE or replace FUNCTION current_java_timestamp RETURN number
AS LANGUAGE JAVA NAME 'java.lang.System.currentTimeMillis() return java.lang.Long';
/

Ответ 4

AFAIK, нет прямого пути для достижения этого (кроме ручного написания длинной функции SQL).

Зачем вам это нужно?

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

Ответ 5

Ниже код дает разницу в миллисекундах:

with t as (select systimestamp - to_timestamp(sysdate ) diff from dual)
select extract(day from diff) * 24 * 3600000+
   extract(hour from diff) * 3600000+
   extract(minute from diff) * 60000 +
   extract(second from diff) * 1000  
    dif
from t

Для преобразования миллисекунд в часы, минуты, секунды, изменение и использование ниже запроса по мере необходимости:

with t as (select systimestamp - to_timestamp(sysdate ) diff from dual)
select extract(day from diff) * 24 * 3600000+
   extract(hour from diff) * 3600000+
   extract(minute from diff) * 60000 +
   extract(second from diff) * 1000  
    dif,
    (to_char (to_date(round(( extract(day from diff) * 24 * 3600000+
   extract(hour from diff) * 3600000+
   extract(minute from diff) * 60000 +
   extract(second from diff) * 1000)/1000), 'SSSSS' ), 'HH24"Hrs" MI"Min" SS"Sec"'))  timeval
from t

Ответ 6

SELECT to_char(sysdate, 'HH24:MI:SS'), to_char(systimestamp, 'HH24:MI:SS.FF6') FROM dual