Hàm Java trả về số mili giây đã trôi qua kể từ một thời điểm cố định. Thời điểm đó là nửa đêm ngày đầu tiên của năm 1970 UTC, tức là thời gian bắt đầu của đồng hồ Unix.
Hàm sau thực hiện tương tự đối với PL / SQL. Nó trừ dấu thời gian hiện tại từ điểm bắt đầu (trong đó ms =1). Nó trích xuất các thành phần thời gian khác nhau và biến chúng thành giây. Cuối cùng, nó nhân mọi thứ với 1000 để nhận giá trị tính bằng mili giây:
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;
/
Nếu bạn đã bật Java trong cơ sở dữ liệu, thay vào đó, bạn có thể thấy việc tạo Thủ tục lưu trữ Java đơn giản hơn:
create or replace function currentTimeMillis return number as
language java name 'java.lang.System.currentTimeMillis() return java.lang.Integer';
/
So sánh hai cách tiếp cận:
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>
(Xin gửi lời cảm ơn tới Simon Nickerson, người đã phát hiện ra lỗi đánh máy trong phiên bản trước của hàm PL / SQL của tôi, tạo ra một kết quả bất thường.)
Ngẫu nhiên, nếu bạn chỉ quan tâm đến thời gian chính xác đến từng giây, Oracle có tích hợp sẵn cho điều đó: DBMS_UTILITY.GET_TIME () .