2015-12-09 2 views
1

Это моя первая публикация здесь. Я смотрел на все темы здесь & другие сайты, но все же я не могу исправить коды.Oracle current_timestamp для второго, включая миллисекунды

Здесь, у меня есть пример таблицы называется LM Если структура выглядит следующим образом: (не может изменить структуру таблицы)

LM_REFID(PK) LM_DESC 
---------------------------------- 
VARCHAR2(50) VARCHAR2(50) 

И LM_REFID является PRIMARY KEY

Итак, вот вещи, Я хочу создать триггер ДОБАВИТЬ, чтобы назначить значения метки времени в секундах, включая миллисекунды. Он должен быть подсчитан в секундах (с миллисекундами) с текущего времени до 1/1/1970 00:00:00 (время в db)

(Поскольку одновременная вставка будет нарушать ПК из-за того же значения секунд, Я хочу, чтобы значения миллисекунды так PK является уникальным)

спусковой выглядит следующим образом:

CREATE OR REPLACE TRIGGER LM_TRG 
BEFORE INSERT ON LM 
REFERENCING NEW AS NEW 
FOR EACH ROW 
BEGIN 
:new.LM_REFID := (SYSDATE - TO_DATE('01/01/1970 00:00:00','MM-DD-YYYY HH24:MI:SS')) 
* 24 * 60 * 60 ; 
END; 
/

Это приведет к значениям, возвращаемым в SECONDS является 1449677554

Но я не хочу, чтобы СЕКУНД только, я хочу миллисекунды тоже, поэтому ПК уникальна. Итак, я попытался заменить функцию SYSDATE на отметку времени там:

:new.LM_REFID:= (CURRENT_TIMESTAMP - TO_TIMESTAMP ('01/01/1970 00:00:00', 
'MM-DD-YYYY HH24:MI:SSFF3')) * 24 * 60 * 60 * 1000 

Но это приводит к ошибке. Я также пробовал других, таких как CAST, EXTRACT, эпоха и многое другое, но все равно не повезло.

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

LM_REFID   
---------------------------- 
1449677554.123456 
1449677554.123344 
1444677554.124466 

Любой человек может помочь улучшить курок? Спасибо.

+0

Почему вы храните номер в столбце 'VARCHAR'? –

+0

Это потому, что я не хочу, чтобы PK 'REF_ID' был изменен, всякий раз, когда данные обновляются. Если какие-либо данные с «REF_ID» будут обновлены, также изменится тип данных timestamp. Вы не можете изменить ПК? Особенно это касается многих таблиц. – Miraie

ответ

1

Может быть что-то вроде этого:

declare 
    l_interval interval day(9) to second(6); 
    l_seconds number(24,6); 
begin 
    l_interval := current_timestamp - timestamp '1970-01-01 00:00:00.000000'; 
    l_seconds := extract(day from l_interval) * 24 * 60 * 60 + 
       extract(hour from l_interval) * 60 * 60 + 
       extract(minute from l_interval) * 60 + 
       extract(second from l_interval); 
    dbms_output.put_line(l_seconds); 
end; 
/

l_seconds будет содержать дробные секунды, а, именно поэтому он должен быть объявлен как number с десятичных цифр.

Но из этого я никогда не получаю больше трех десятичных цифр - не знаю почему.

+0

Я получаю результат как '1449641265.252022' более 6 цифр десятичных знаков. –

+0

спасибо, что решите проблему. Я тоже получаю только 3 десятичных знака. – Miraie

Смежные вопросы