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() .