获取间隔(以毫秒为单位)

Jer*_*acs 9 postgresql intervals postgresql-9.1

我有一个包含这样的代码的过程:

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

我的想法是,我希望获得运行语句或语句集合所需的时间.

问题是,这会返回00:00:00亚秒的经过时间.我真的很想看到毫秒.我怎样才能做到这一点?

有关使用EXTRACT和的问题和答案EPOCH,但这似乎是在"第二"级别,这对我的目的来说不够精细.

UPDATE

使用@ twn08的答案,我最终得出了以下解决方案:

我声明了以下变量:

declare
    processStart timestamp;
    elapsed numeric(18,3);
    processFinish timestamp;
Run Code Online (Sandbox Code Playgroud)

然后,在开始这个过程之前:

processStart := clock_timestamp();
Run Code Online (Sandbox Code Playgroud)

在完成这个过程后,我运行了这个:

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

这在游泳中起作用.

Tom*_*eif 17

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
Run Code Online (Sandbox Code Playgroud)

注意:

对于9.0+版本,您可以在文档中阅读以下示例:

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

在9.0之前:

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

基于此,我的示例在9.0版之前是否有效尚不完全清楚


liq*_*dki 7

这是一个单行代码,用于计算从过去的 TIMESTAMP 到 now() 的经过时间(以毫秒为单位):

SELECT ROUND((EXTRACT (EPOCH FROM now()) - EXTRACT (EPOCH FROM pg_last_xact_replay_timestamp())) * 1000) AS "replication_lag (ms)";
Run Code Online (Sandbox Code Playgroud)

上面的示例计算了主 PostgreSQL 服务器和备用 PostgreSQL 服务器之间的复制延迟,因此只需替换pg_last_xact_replay_timestamp()为您的 TIMESTAMP。

要更清楚地了解它在做什么:

SELECT
    ROUND ((
        EXTRACT (EPOCH FROM now()) -
        EXTRACT (EPOCH FROM pg_last_xact_replay_timestamp())
    ) * 1000)
AS "replication_lag (ms)";
Run Code Online (Sandbox Code Playgroud)

输出:

 replication_lag (ms) 
----------------------
                  562
(1 row)
Run Code Online (Sandbox Code Playgroud)