Oracle systimestamp (sysdate) до миллисекунд
Не могли бы вы обеспечить реализацию хранимой функции для получения текущего systimestamp
в миллисекундах.
Что-то, что я могу использовать, например
select current_time_ms from dual;
и получить разницу, измеренную в миллисекундах, между текущим временем и полночью, 1 января 1970 г. UTC.
Спасибо.
Ответы
Ответ 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