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

2つのOracleタイムスタンプ間の秒数の取得

    「ベストプラクティス」

    何をするにしても、それを関数でラップします。 seconds_between (from_date, to_date) -それがどのように行われるかは関係ありません(最も効率的な方法を選択してください)-そうすれば、コードが何をしているのかが完全に明らかになります。

    パフォーマンス

    以下のテストケースを使用して、ラップトップ(WinXP)の11gR1で2つの方法をテストしました。 CASTオプションが最速のようです。 (t1はベースライン、t2はextractを使用しました メソッド、t3はcastを使用しました メソッド)

    t1 (nothing) 3
    t2 (extract) 338
    t3 (cast)    101
    
    t1 (nothing) 3
    t2 (extract) 336
    t3 (cast)    100
    

    テストスクリプト

    declare
     x TIMESTAMP := SYSTIMESTAMP;
     y TIMESTAMP := TRUNC(SYSDATE);
     n PLS_INTEGER;
     lc CONSTANT PLS_INTEGER := 1000000;
     t1 PLS_INTEGER;
     t2 PLS_INTEGER;
     t3 PLS_INTEGER;
    begin
     t1 := DBMS_UTILITY.get_time;
     for i in 1..lc loop
      n := i;
     end loop;
     t1 := DBMS_UTILITY.get_time - t1;
     t2 := DBMS_UTILITY.get_time;
     for i in 1..lc loop
      n := extract(day from (x-y))*24*60*60
         + extract(hour from (x-y))*60*60
         + extract(minute from (x-y))*60
         + extract(second from (x-y));
     end loop;
     t2 := DBMS_UTILITY.get_time - t2;
     t3 := DBMS_UTILITY.get_time;
     for i in 1..lc loop
      n := ( CAST( x AS DATE ) - CAST( y AS DATE ) ) * 86400;
     end loop;
     t3 := DBMS_UTILITY.get_time - t3;
     dbms_output.put_line('t1 (nothing) ' || t1);
     dbms_output.put_line('t2 (extract) ' || t2);
     dbms_output.put_line('t3 (cast)    ' || t3);
    end;
    


    1. > signinoracleでrownum関数を使用する

    2. 圧縮されたPostgreSQL行を個別の列に展開するにはどうすればよいですか?

    3. 2つのテーブルを結合しながらクエリを更新しますか?

    4. 複数の列を持つMySQLカーソルベースのページネーション