метка-оракула (sysdate) в миллисекундах - PullRequest
12 голосов
/ 22 августа 2011

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

select current_time_ms from dual;

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

Спасибо.

Ответы [ 6 ]

18 голосов
/ 23 августа 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;
7 голосов
/ 22 августа 2011

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

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;

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

4 голосов
/ 24 января 2015

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

CREATE or replace FUNCTION current_java_timestamp RETURN number
AS LANGUAGE JAVA NAME 'java.lang.System.currentTimeMillis() return java.lang.Long';
/
1 голос
/ 07 мая 2014

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

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
1 голос
/ 22 августа 2011

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

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

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

0 голосов
/ 21 июня 2017
SELECT to_char(sysdate, 'HH24:MI:SS'), to_char(systimestamp, 'HH24:MI:SS.FF6') FROM dual
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...