我想計算開始時間(型別變數timestamptz)與NOW()函式完成時刻之間的差異。
select * from _get_date_diff_ms(NOW(), NOW())
將 supabase.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;
uj5u.com熱心網友回復:
我認為你正在尋找的是:
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
我在函式呼叫中設定了一個負間隔來實際得到一個差異。有關各種時間函式的作用,請參閱當前時間。
uj5u.com熱心網友回復:
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() 和 current_timestamp 的區別
此外,為了您表達的目的,開始時傳遞“開始時間”是沒有意義的。
- 您的意思是交易的開始時間:然后
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。
看:
- 獲取 PostgreSQL 查詢的執行時間
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/350383.html
標籤:PostgreSQL plpgsql 定时 超基地
上一篇:合并2個PostgreSQL表
