2010-05-13 75 views
11

我希望能够以毫秒为单位在Oracle编号字段中存储当前时间。我如何通过查询做到这一点?甲骨文Equalvalent的Java System.currentTimeMillis()?

select systimestamp from dual; 

返回实际的时间戳。无论如何,我可以像Java的System.currentTimeMillis()一样将它转换成毫秒数?

+0

一些这里有用的建议:http://www.dba-oracle.com/t_timestamp_math_elapsed_times.htm – 2010-05-13 06:32:27

回答

6

的Java函数返回,因为在一段固定的时刻已经过去的毫秒数。那个时间是1970年UTC的第一天午夜,即Unix时钟时间的开始。

下面的函数为PL/SQL相同。它从起始点(其中ms = 1)中减去当前时间戳。它提取各种时间分量并将其转换为秒。最后,由1000乘以一切办法去以毫秒为单位的值:

create or replace function current_millisecs 
    return number 
is 
    base_point constant timestamp := to_timestamp('01-JAN-1970 00:00:00.000'); 
    now constant timestamp := systimestamp AT TIME ZONE 'UTC' ; 
begin 
    return (
        ((extract(day from (now-base_point)))*86400) 
       + ((extract(hour from (now-base_point)))*3600) 
       + ((extract(minute from (now-base_point)))*60) 
       + ((extract(second from (now-base_point)))) 
      ) * 1000; 
end; 
/

如果在数据库中启用了Java,你可能会发现它更简单的创建一个Java存储过程,而不是:的

create or replace function currentTimeMillis return number as 
language java name 'java.lang.System.currentTimeMillis() return java.lang.Integer'; 
/

比较这两种方法:

SQL> select currentTimeMillis as JAVA 
    2   , current_millisecs as PLSQL 
    3   , currentTimeMillis - current_millisecs as DIFF 
    4 from dual 
    5/

     JAVA  PLSQL  DIFF 
---------- ---------- ---------- 
1.2738E+12 1.2738E+12   0 

SQL> 

(我要感谢西蒙·尼克森,谁在我的PL/SQL函数的前一版本相比产生了反常的结果发现错字。 )


顺便说一句,如果你只在时间到最近的百分之一秒兴趣,Oracle有一个内置的是:DBMS_UTILITY.GET_TIME()

+0

有3600秒,一小时,而不是3660 – 2010-05-13 16:40:20

+0

@SimonNickerson - 啊,这可以解释它!谢谢。 – APC 2010-05-13 16:59:28

+0

根据您的设置,您可能需要创建base_point时间戳如下: TO_TIMESTAMP( '1970-01-01 00:00:00.000', 'YYYY-MM-DD HH24:MI:SS.FF') – Vladimir 2010-12-08 16:08:55

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; 
1

这个链接可以帮助所有语言 currentmillis.com 对于Oracle:

SELECT (SYSDATE - TO_DATE('01-01-1970 00:00:00', 'DD-MM-YYYY HH24:MI:SS')) * 24 * 60 * 60 * 1000 FROM DUAL 
+0

不正确的答案,因为它没有考虑当前时区考虑在内。 – 2017-03-13 23:48:22

+0

当前时区在SYSDATE中考虑在内。它工作正常 – Milad 2017-03-14 09:34:43

+0

彼此的几秒钟内:当前时间米利斯按https://currenttimemillis.com:1489491379553个 当前时间米利斯按照上面的方法:1489529163000 差异:37891447 – 2017-03-14 11:37:24