Fungsi Java mengembalikan jumlah milidetik yang telah berlalu sejak momen tertentu dalam waktu. Waktu itu adalah tengah malam pada hari pertama tahun 1970 UTC, yaitu awal dari waktu jam Unix.
Fungsi berikut melakukan hal yang sama untuk PL/SQL. Ini mengurangi stempel waktu saat ini dari titik awal (di mana ms=1). Ini mengekstrak berbagai komponen waktu dan mengubahnya menjadi detik. Akhirnya ia mengalikan semuanya dengan 1000 untuk mendapatkan nilai dalam milidetik:
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;
/
Jika Anda mengaktifkan Java di database, Anda mungkin merasa lebih mudah untuk membuat Java Stored Procedure sebagai gantinya:
create or replace function currentTimeMillis return number as
language java name 'java.lang.System.currentTimeMillis() return java.lang.Integer';
/
Perbandingan dua pendekatan:
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>
(Terima kasih saya sampaikan kepada Simon Nickerson, yang menemukan kesalahan ketik di versi sebelumnya dari fungsi PL/SQL saya yang menghasilkan hasil yang tidak wajar.)
Kebetulan, jika Anda hanya tertarik pada waktu hingga centisecond terdekat, Oracle memiliki bawaan untuk itu:DBMS_UTILITY.GET_TIME() .