以毫秒为单位获取间隔

Posted

技术标签:

【中文标题】以毫秒为单位获取间隔【英文标题】:Get interval in milliseconds 【发布时间】:2013-05-26 02:15:36 【问题描述】:

我有一个包含如下代码的过程:

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;

这很顺利。

【问题讨论】:

可以提取毫秒数:SELECT EXTRACT(MILLISECONDS FROM Now()); 【参考方案1】:

根据@TomasGreif 的回答,我做了一个小 datediff 函数,以防您经常需要执行毫秒 datediffs:

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;

【讨论】:

【参考方案2】:

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

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)

【讨论】:

【参考方案3】:
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 版之前运行并不完全清楚

【讨论】:

虽然这个答案不是很清楚,但它确实帮助我弄清楚了我需要做什么。请参阅我编辑的问题以了解最终结果。 仅供参考:EXTRACT(EPOCH FROM t) 绝对适用于 8.4。

以上是关于以毫秒为单位获取间隔的主要内容,如果未能解决你的问题,请参考以下文章

Prometheus 和 Node 导出器(以毫秒为单位)

接收消息作为输入并从用户那里获取间隔值

获取时间间隔并在目标 C 中播放声音

尝试从一组 30 分钟的时间间隔中获取以小时为单位的开始和结束时间,但某些结果未正确返回

qml 定时器以及几种简单动画

获取鼠标双击时间间隔