我有一个表格,我想在其中计算插入一行后两列之间的时间差(以小时为单位)。每当对表执行插入或更新时,我想设置一个触发器来执行此操作。
我的列是 delay_start、delay_stop 和 delay_duration。我想执行以下操作:
delay_duration = delay_stop - delay_start
结果应该是数字 (4,2) 值并进入 delay_duration 类别。以下是我到目前为止的内容,但由于某种原因它不会填充该列。
BEGIN
INSERT INTO public.deckdelays(delay_duration)
VALUES(DATEDIFF(hh, delay_stop, delay_start));
RETURN NEW;
END;
我对这一切都很陌生,所以如果有人能提供帮助,我将不胜感激!
答案 0 :(得分:1)
如果您有 Postgres 12 或更高版本,您可以将 delay_duration 定义为生成的列。这可以让您消除触发器。
create table deckdelays(id integer generated always as identity
, delay_start timestamp
, delay_stop timestamp
, delay_duration numeric(4,2)
generated always as
( extract(epoch from (delay_stop - delay_start))/3600 )
stored
--, other attributes
);
但如果你坚持触发:
create or replace
function delayduration_func()
returns trigger
language plpgsql
as $$
begin
new.delay_duration = (extract(epoch from (deckdelays.delay_stop - deckdelays.delay_start))/3600)::numeric;
return new;
end;
$$;
create trigger delaydurationset1
before insert
or update of delay_stop, delay_start
on deckdelays
execute procedure delayduration_func();
变化: