Oracle equaivalent of java System.currentTimeMillis()?

后端 未结 4 1216
闹比i
闹比i 2021-02-02 00:37

I want to be able to store the current time in milliseconds in an Oracle number field. How do I do this via a query?

select systimestamp from dual; 
4条回答
  •  孤街浪徒
    2021-02-02 01:14

    The Java function returns the number of milliseconds which have elapsed since a fixed moment in time. That time is midnight on the first day of 1970 UTC, i.e. the start of Unix clock time.

    The following function does the same for PL/SQL. It subtracts the current timestamp from the starting point (where ms=1). It extracts the various time components and turns them into seconds. Finally it multiplies everything by 1000 to get the value in milliseconds:

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

    If you have Java enabled in the database you may find it simpler to create a Java Stored Procedure instead:

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

    Comparison of the two approaches:

    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>
    

    (My thanks go to Simon Nickerson, who spotted the typo in the previous version of my PL/SQL function which produced an anomalous result.)


    Incidentally, if you are only interested in time to the nearest centisecond, Oracle has a built-in for that: DBMS_UTILITY.GET_TIME().

提交回复
热议问题