2011-08-22 62 views
12

貴國是否能實現存儲功能來獲取當前systimestamp爲毫秒。
東西我可以像使用甲骨文SYSTIMESTAMP(SYSDATE),以毫秒爲單位

select current_time_ms from dual; 

,並獲得差異,以毫秒爲單位,當前時間和午夜,1970年1月,UTC之間。

謝謝。

+1

看http://stackoverflow.com/questions/5881235/oracle-current-timestamp-to-seconds-conversion。答案越來越短。 – Vadzim

回答

15
  • 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

如果會話時區恰好是從系統的不同,這可以通過24小時當午夜稱爲(取決於兩個時區如何關聯前後)的返回值了。您可以使用'ALTER SESSION SET TIME_ZONE ='+ 08:00''或類似的方法輕鬆測試。修復看起來很簡單:在表達式中用(sys_extract_utc(systimestamp)...)替換'from(systimestamp ...''''。 –

+0

修復了,謝謝。 –

+0

我寫了「純Java」版本(請參閱我的答案)。令我驚訝的是,在非常簡單的測試中,Java版本比PL/SQL更快。 –

8

我知道的最好的事情是:

select extract(day from (systimestamp - timestamp '1970-01-01 00:00:00')) * 86400000 
    + extract(hour from (systimestamp - timestamp '1970-01-01 00:00:00')) * 3600000 
    + extract(minute from (systimestamp - timestamp '1970-01-01 00:00:00')) * 60000 
    + extract(second from (systimestamp - timestamp '1970-01-01 00:00:00')) * 1000 unix_time 
from dual; 

我不太清楚你對什麼要求時區。您可能需要對此進行微調。

+3

Tt沒有考慮到閏年。 –

+1

它是精確到秒,不毫秒 –

1

據我所知,沒有實現這一目標沒有直接的方法(比手動編寫冗長的SQL函數等)。

爲什麼需要這個特別?

你可以使用一個存儲Java函數,然後使用System.getCurrentMillis()Java提供到現在從1.1.1970回到你以毫秒爲單位的值。

+0

-1,@科多的答案是直接的,少囉嗦,寫它的Java函數和PL/SQL包裝。 – DCookie

+0

同意,如果你可以在SQL中做,那麼你應該。 – Ollie

+1

這是正確的做法。其他答案有微妙的錯誤,因爲它不考慮閏年或閏秒等事情。 – Pablo

1

下面代碼給出以毫秒爲單位的區別:

with t as (select systimestamp - to_timestamp(sysdate) diff from dual) 
select extract(day from diff) * 24 * 3600000+ 
    extract(hour from diff) * 3600000+ 
    extract(minute from diff) * 60000 + 
    extract(second from diff) * 1000 
    dif 
from t 

對於毫秒的轉換時間,分鐘,秒,修改並使用下面的查詢酌情:(!這看起來是正確的)

with t as (select systimestamp - to_timestamp(sysdate) diff from dual) 
select extract(day from diff) * 24 * 3600000+ 
    extract(hour from diff) * 3600000+ 
    extract(minute from diff) * 60000 + 
    extract(second from diff) * 1000 
    dif, 
    (to_char (to_date(round((extract(day from diff) * 24 * 3600000+ 
    extract(hour from diff) * 3600000+ 
    extract(minute from diff) * 60000 + 
    extract(second from diff) * 1000)/1000), 'SSSSS'), 'HH24"Hrs" MI"Min" SS"Sec"')) timeval 
from t 
4

添加到@Mykhaylo Adamovych答案在這裏不用使用Oracle的Java支持一個更簡單的方法(即不在XE中,不在AWS RDS中)。便攜性較差(如果您在意),但在我的測試中似乎更快。

CREATE or replace FUNCTION current_java_timestamp RETURN number 
AS LANGUAGE JAVA NAME 'java.lang.System.currentTimeMillis() return java.lang.Long'; 
/
0
SELECT to_char(sysdate, 'HH24:MI:SS'), to_char(systimestamp, 'HH24:MI:SS.FF6') FROM dual 
相關問題