PostgreSQL中的日期减法
`我有一个workers表,它有一个startdate列,表示员工开始工作的时间。所以我想创建一个触发器,如果工作时间少于一年365天,我将给出一个例外。但是代码有点问题。有什么帮助吗PostgreSQL中的日期减法,sql,database,postgresql,Sql,Database,Postgresql,`我有一个workers表,它有一个startdate列,表示员工开始工作的时间。所以我想创建一个触发器,如果工作时间少于一年365天,我将给出一个例外。但是代码有点问题。有什么帮助吗 CREATE OR REPLACE FUNCTION control_func() RETURNS TRIGGER AS ' declare int1 integer; tt Date; begin select now()::date into tt; select s_date from workers
CREATE OR REPLACE FUNCTION control_func() RETURNS TRIGGER AS '
declare
int1 integer;
tt Date;
begin
select now()::date into tt;
select s_date from workers;
if(tt-s_date<365) then
RAISE EXCEPTION ''A message'';
end if;
RETURN NULL;
END;
' LANGUAGE 'plpgsql';
EDIT:初始语法应该是datediff。但是,它是一种MYSQL语法。因此,你最好能给出上述详细而正确的答案 在你的代码里, 添加另一个变量以保存s_日期,例如ss
如果Datediffdays、tt、ss<365,则您有几个问题。首先,不要使用单引号引用函数体,这会造成很大的混乱,请使用: 接下来,这没有任何用处:
select s_date from workers;
这将试图从员工那里获取所有s_日期值,然后将它们全部扔掉。您希望查看触发器的当前行,该行位于:
新的
数据类型记录;在行级触发器中保存用于插入/更新操作的新数据库行的变量。对于语句级触发器和删除操作,此变量为NULL
因此,您可以查看new.s_date以查看您感兴趣的日期:
select now()::date into tt;
if tt - new.s_date < 365 then
raise exception 'A message';
end if;
如果有,错误是什么?你不应该在“现在”和“日期”上分别执行日期部分吗?@bonCodigo:now::date表达式只返回日期。使用当前日期是一个更好的主意。@Catcall:使用当前日期也可以避免在施法时出现这种情况。代码有问题。始终显示您的PostgreSQL版本、代码以及任何错误消息的准确全文。您不需要日期部分,PostgreSQL中两个日期之间的差异是。@muistooshort我在mobile中键入了它,然后就消失了。词典将datediff转换为date\u部分。正如您可能已经注意到的,Datediff语法更为清晰,我意识到这是POSTGRES而不是MYSQL….:-
select now()::date into tt;
if tt - new.s_date < 365 then
raise exception 'A message';
end if;
create or replace function control_func() returns trigger as $$
begin
if current_date - new.s_date < 365 then
raise exception 'A message';
end if;
return new;
end;
$$ language plpgsql;