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

时间:2013-05-30 13:17:15

标签: postgresql postgresql-9.1 intervals

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

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

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

问题是,这会在经过时间的亚秒内返回00:00:00。我真的很想看到毫秒。我怎么能这样做?

有关使用EXTRACTEPOCH的问题和答案,但这似乎是在“第二”级别,而且对于我的目的来说还不够精确。

更新

使用@ 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;

这很有效。

3 个答案:

答案 0 :(得分:16)

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+,您可以在documentation中阅读以下示例:

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

9.0之前there is

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

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

答案 1 :(得分:3)

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

SELECT ROUND((EXTRACT (EPOCH FROM now()) - EXTRACT (EPOCH FROM pg_last_xact_replay_timestamp())) * 1000) AS "replication_lag (ms)";

以上示例计算主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)";

输出:

 replication_lag (ms) 
----------------------
                  562
(1 row)

答案 2 :(得分:2)

根据@ TomasGreif的回答,我做了一个小的日期功能,以防你需要经常做毫秒级的日期:

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;