Oracle current_timestamp到秒,包括毫秒

时间:2015-12-09 09:03:01

标签: oracle plsql oracle11g triggers timestamp

这是我第一次在这里发帖。我一直在寻找这里的所有主题&其他网站,但我仍然无法修复这些代码。

在这里,我有一个名为http://localhost/#access_token=ACCESS-TOKEN的示例表,其结构如下所示:(不能更改表结构)

LM

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

所以,在这里,我想创建一个BEFORE INSERT触发器,以秒为单位分配时间戳值,包括毫秒。必须以秒为单位(以毫秒为单位)从当前时间到1/1/1970 00:00:00(db时间)进行计数

(考虑到同时插入会因相同的秒值而违反PK。因此,我想要毫秒值,因此PK是唯一的)

触发器如下所示:

PRIMARY KEY

这会导致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

但我不想要SECONDS,我也想要毫秒,所以PK是独一无二的。所以,我尝试用时间戳替换SYSDATE函数,如:

1449677554

但它会导致错误。我也尝试了其他像:new.LM_REFID:= (CURRENT_TIMESTAMP - TO_TIMESTAMP ('01/01/1970 00:00:00', 'MM-DD-YYYY HH24:MI:SSFF3')) * 24 * 60 * 60 * 1000 ,epoch等等,但仍然没有运气。

我希望示例数据应该如下所示:

CAST, EXTRACT

任何人都可以帮助改善触发器? 谢谢。

1 个答案:

答案 0 :(得分: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

但我从来没有超过三位小数 - 不知道为什么。