sql >> データベース >  >> RDS >> Oracle

Java System.currentTimeMillis()と同等のOracle?

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



    1. javafxのデータベースから表示するデータのフィルタリング

    2. MySQLの`IN()`でコンマ区切りの文字列を使用する

    3. アカウントの残高を計算するためのSQLクエリ

    4. MySQLの一意のIDまたは結合されたID