如何测量函数中以毫秒为单位的时间差?

How to measure time difference in milliseconds in a function?

我想计算开始时间(timestamptz 类型的变量)和我的函数完成的 NOW() 时刻之间的差异。

select * from _get_date_diff_ms(NOW(), NOW())

在 PG 13.3 中使用 supabase.io,我收到此错误消息:

operator does not exist: timestamp with time zone - double precision"
CREATE OR REPLACE FUNCTION _get_date_diff_ms(p_begin_time timestamptz, p_end_time timestamptz)
RETURNS int AS
$$
    BEGIN
        RETURN ROUND ((
            EXTRACT (EPOCH FROM p_begin_time -
            EXTRACT (EPOCH FROM p_end_time)
        ) * 1000));
    END;
$$ LANGUAGE plpgsql;

我想你要找的是:



CREATE OR REPLACE FUNCTION public._get_date_diff_ms(p_begin_time timestamp with time zone)
 RETURNS integer
 LANGUAGE plpgsql
AS $function$
    BEGIN
        RETURN round((EXTRACT(EPOCH FROM clock_timestamp() - p_begin_time ) * 1000));
    END;                                                                                
$function$
;

 select _get_date_diff_ms(now() - interval '.5 sec');
 _get_date_diff_ms 
-------------------
              500

我在函数调用中设置了一个负间隔以实际获得差异。有关各种时间函数的内容,请参阅 Current time.

operator does not exist: timestamp with time zone - double precision

那只是因为括号错误。你的意思是:

        RETURN ROUND ((
            EXTRACT (EPOCH FROM p_begin_time) -    -- !
            EXTRACT (EPOCH FROM p_end_time)
        ) * 1000);

但是整个方法都被打破了。现在已经指出 now() 是 Postgres 事务中的一个稳定值。参见:

此外,为了您表达的目的,通过“开始时间”开始是没有意义的。

  • 要么你的意思是交易的开始时间:然后在函数的任何地方使用now()
  • 或者你的意思是函数的开始时间:然后在函数的开始使用clock_timestamp()

假设是后者,我建议:

CREATE OR REPLACE FUNCTION public._get_date_diff_ms() -- no parameter
 RETURNS numeric  -- !
 LANGUAGE plpgsql AS
$func$
DECLARE
   _start_ts timestamptz := clock_timestamp();  -- !
BEGIN
   PERFORM pg_sleep(1);   --  do something here (1 sec example)
   RETURN round(1000 * EXTRACT(epoch FROM clock_timestamp() - _start_ts), 3);
END                                                                                
$func$;

致电:

test=> SELECT public._get_date_diff_ms();
 _get_date_diff_ms 
-------------------
          1003.440

I return numeric 用 3 个小数位代替 integer 来捕获微秒。否则,对于许多快速操作,它只会报告 0。

参见:

  • Get execution time of PostgreSQL query