Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Oracle-Äquivalent von Java System.currentTimeMillis()?

Die Java-Funktion gibt die Anzahl der Millisekunden zurück, die seit einem festgelegten Zeitpunkt vergangen sind. Diese Zeit ist Mitternacht am ersten Tag von 1970 UTC, d. h. der Beginn der Unix-Uhrzeit.

Die folgende Funktion macht dasselbe für PL/SQL. Es subtrahiert den aktuellen Zeitstempel vom Startpunkt (wobei ms =1). Es extrahiert die verschiedenen Zeitkomponenten und wandelt sie in Sekunden um. Schließlich wird alles mit 1000 multipliziert, um den Wert in Millisekunden zu erhalten:

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

Wenn Sie Java in der Datenbank aktiviert haben, ist es möglicherweise einfacher, stattdessen eine gespeicherte Java-Prozedur zu erstellen:

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

Vergleich der beiden Ansätze:

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>

(Mein Dank geht an Simon Nickerson, der den Tippfehler in der vorherigen Version meiner PL/SQL-Funktion entdeckt hat, der zu einem anomalen Ergebnis geführt hat.)

Übrigens, wenn Sie nur an der Zeit auf die nächste Centisekunde interessiert sind, hat Oracle dafür einen eingebauten:DBMS_UTILITY.GET_TIME() .