Oracle相当于java System.currentTimeMillis()?

时间:2010-05-13 06:07:18

标签: oracle time

我希望能够在Oracle数字字段中以毫秒为单位存储当前时间。我如何通过查询来做到这一点?

select systimestamp from dual; 

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

4 个答案:

答案 0 :(得分:9)

Java函数返回自固定时刻以来经过的毫秒数。那个时间是1970年世界贸易组织的第一天午夜,即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>

(我要感谢Simon Nickerson,他在我之前版本的PL / SQL函数中发现了拼写错误,产生了异常结果。)


顺便提一下,如果您只对最近的厘秒感兴趣,那么Oracle就有内置功能:DBMS_UTILITY.GET_TIME()

答案 1 :(得分:2)

此链接有助于所有语言 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

答案 2 :(得分:1)

  • DB timezone agnostic
  • 毫秒
  • 适用于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;

答案 3 :(得分:0)

尝试一下-

选择提取(((sys_extract_utc(systimestamp AT TIME ZONE'GMT')-to_timestamp('1970-01-01','YYYY-MM-DD'))的天)* 86400000 + to_number(to_char(sys_extract_utc(systimestamp AT TIME ZONE'GMT'),'SSSSSFF3')) 从双重;