0

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

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

将 supbase.io 与 PG 13.3 一起使用,我收到以下错误消息:

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;
4

2 回答 2

2

我认为您正在寻找的是:



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

我在函数调用中抛出了一个负间隔以实际获得差异。有关各种时间功能的作用,请参见当前时间

于 2021-11-05T23:31:58.677 回答
1
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

我返回numeric3 个小数位而不是integer捕获微秒。否则,对于许多快速操作,它只会报告 0。

看:

于 2021-11-06T03:52:01.543 回答