Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PostgreSQL中的日期减法_Sql_Database_Postgresql - Fatal编程技术网

PostgreSQL中的日期减法

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

`我有一个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; 
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;