sql >> Databáze >  >> RDS >> Oracle

Oracle ekvivalentní java System.currentTimeMillis()?

Funkce Java vrací počet milisekund, které uplynuly od určitého okamžiku v čase. Tím časem je půlnoc prvního dne roku 1970 UTC, tj. začátek unixového času.

Následující funkce dělá totéž pro PL/SQL. Odečte aktuální časové razítko od počátečního bodu (kde ms=1). Extrahuje různé časové složky a mění je na sekundy. Nakonec vše vynásobí 1000 a získá hodnotu v milisekundách:

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

Pokud máte v databázi povolenou Javu, může být jednodušší místo toho vytvořit uloženou proceduru Java:

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

Porovnání obou přístupů:

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>

(Moje poděkování patří Simonu Nickersonovi, který si všiml překlepu v předchozí verzi mé funkce PL/SQL, což vedlo k anomálnímu výsledku.)

Mimochodem, pokud vás zajímá pouze čas na nejbližší centisekundu, Oracle má pro to vestavěný:DBMS_UTILITY.GET_TIME() .



  1. MySQL varchar(2000) vs text?

  2. Jak seskupit podle roku v SQL

  3. Jak mohu zadat IF ELSE CONDITION do dotazu Oracle?

  4. WSO2 API Manager:chpasswd.sh nefunguje při použití externí databáze