Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Oracle odpowiednik java System.currentTimeMillis()?

Funkcja Java zwraca liczbę milisekund, które upłynęły od ustalonego momentu w czasie. Czas ten to północ pierwszego dnia 1970 UTC, czyli początek czasu uniksowego.

Poniższa funkcja robi to samo dla PL/SQL. Odejmuje bieżący znacznik czasu od punktu początkowego (gdzie ms=1). Wyodrębnia różne składniki czasu i zamienia je w sekundy. Na koniec mnoży wszystko przez 1000, aby uzyskać wartość w milisekundach:

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

Jeśli masz włączoną obsługę języka Java w bazie danych, może być prostsze utworzenie procedury składowanej Java:

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

Porównanie dwóch podejść:

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>

(Dziękuję Simonowi Nickersonowi, który zauważył literówkę w poprzedniej wersji mojej funkcji PL/SQL, która dała nietypowy wynik.)

Nawiasem mówiąc, jeśli interesuje Cię czas z dokładnością do najbliższej setnej sekundy, Oracle ma do tego wbudowaną funkcję:DBMS_UTILITY.GET_TIME() .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wyjątek NO_DATA_FOUND nie jest zgłaszany, gdy jest używany w SELECT INTO

  2. Oracle SQL Developer - brak ocijdbc12 w java.library.path

  3. Oracle 11g — Znajdź rekordy w CLOB z kanałem zwrotu karetki

  4. Jak zaktualizować wszystkie wiersze z wyjątkiem jednego z wielu spełniających dany warunek?

  5. Jak obliczyć średnią kolumny, a następnie uwzględnić ją w zapytaniu wybierającym w Oracle?