如何测量函数中以毫秒为单位的时间差?
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
我想计算开始时间(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