使用触发器计算PostgreSQL中dob的年龄

时间:2016-03-09 11:39:47

标签: postgresql

我正在尝试计算在表staff中插入或更新记录时的人的年龄,但不知何故下面的触发器功能不起作用:

create or replace function Age() 
returns trigger as $body$
declare
dob1 date;
age1 integer;
BEGIN
select dob into dob1 from staff; 
select age(current_date,dob) into age1;
update staff set age=age1;
END; $body$ language plpgsql;

create trigger trig_age
before insert or update on staff
FOR EACH ROW
execute procedure age();

我不确定上面的代码。我想要一个触发器来计算并在一些表中插入DOB时插入AGE

1 个答案:

答案 0 :(得分:2)

首先,触发器功能的名称可能不是最合适的。该名称已经存在一个重载的常规函数​​,虽然参数不同而PostgreSQL因此接受它,但您可能会混淆任何人使用您的代码。

否则你就不远了。主要的变化是你不应该在触发器触发的同一个表的触发器函数中调用UPDATE:你可能会得到一个无限循环。只需使用NEW隐式参数的赋值。由于您显然想要一个人的年龄,您应该将具体的date_part()纳入字段age

CREATE OR REPLACE FUNCTION age_in_years() RETURNS TRIGGER AS $body$
BEGIN
  NEW.age := date_part('year', CURRENT_TIME - NEW.dob::timestamp);
  RETURN NEW; -- or the insert or update would fail
END; 
$body$ LANGUAGE plpgsql;

设置NEW参数中的值并在函数末尾返回该参数将更改将插入或更新到表中的值。

但是,一个人的年龄可能会在更新之间发生变化,因此您可能最好从表age中删除列staff(因此也是触发器),然后创建一个视图每当访问该视图时计算age

CREATE VIEW staff_today AS 
  SELECT *, date_part('year', CURRENT_TIME - dob::timestamp) AS age
  FROM staff;

就像这样,你将永远得到正确的年龄。