2010-05-13 70 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