Java関数は、一定の時点から経過したミリ秒数を返します。その時刻は、1970 UTCの初日の真夜中、つまりUnixの時刻の始まりです。
次の関数は、PL/SQLに対して同じことを行います。開始点(ms =1)から現在のタイムスタンプを減算します。さまざまな時間コンポーネントを抽出し、それらを秒に変換します。最後に、すべてに1000を掛けて、ミリ秒単位の値を取得します。
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;
/
データベースでJavaを有効にしている場合は、代わりにJavaストアドプロシージャを作成する方が簡単な場合があります。
create or replace function currentTimeMillis return number as
language java name 'java.lang.System.currentTimeMillis() return java.lang.Integer';
/
2つのアプローチの比較:
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>
(以前のバージョンのPL /SQL関数で異常な結果を生成したタイプミスを見つけたSimonNickersonに感謝します。)
ちなみに、センチ秒単位の時間のみに関心がある場合は、Oracleにそのための組み込みがあります。 DBMS_UTILITY.GET_TIME() 。