18

次のようなコードを含むプロシージャがあります。

processStart := current_timestamp;
-- run statement(s)
processEnd := current_timestamp;
elapsed := processEnd - processStart;
raise notice 'My Statement, elapsed time: %', elapsed;

アイデアは、ステートメントまたはステートメントのコレクションの実行にかかる時間を取得したいということです。

00:00:00問題は、これが1 秒未満の経過時間で返されることです。私は本当にミリ秒を見たいです。これどうやってするの?

EXTRACTandの使用に関する質問と回答がありますEPOCHが、これは「第 2 の」レベルにあるようで、私の目的には十分な粒度ではありません。

アップデート

@twn08の回答を使用して、最終的に次の解決策にたどり着きました。

次の変数を宣言しました。

declare
    processStart timestamp;
    elapsed numeric(18,3);
    processFinish timestamp;

次に、プロセスを開始する前に:

processStart := clock_timestamp();

プロセスが終了した後、これを実行しました:

processFinish := clock_timestamp();
elapsed := cast(extract(epoch from (processFinish - processStart)) as numeric(18,3));
raise notice 'My Statement, elapsed time: % ms', elapsed;

これはうまく機能しました。

4

3 に答える 3

22
with t as
 (select
    Now() as tend, 
    Now() - interval '10 seconds 552 milliseconds' as tstart
 )

select
  extract('epoch' from tend)  - extract('epoch' from tstart) 
from 
  t

ノート:

バージョン 9.0+ の場合、ドキュメントで次の例を読むことができます。

SELECT EXTRACT(EPOCH FROM TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40.12-08');
Result: 982384720.12

9.0 より前次のとおりです。

SELECT EXTRACT(EPOCH FROM TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40-08');
Result: 982384720

これに基づいて、私の例がバージョン 9.0 より前で機能するかどうかは完全には明らかではありません

于 2013-05-30T13:37:31.257 に答える
3

@TomasGreif の回答に基づいて、ミリ秒の datediff を頻繁に実行する必要がある場合に備えて、小さな datediff 関数を作成しました。

create function datediff_ms(timestamptz, timestamptz) returns INTEGER as
$$
    begin
        return (EXTRACT('epoch' from $2) - EXTRACT('epoch' from $1)) * 1000;
    end;
$$ LANGUAGE plpgsql;

使用法:

select datediff_ms(time1, time2)
from sometables;
于 2018-05-10T08:33:27.290 に答える