第 1 行或接近"VARCHAR"语法错误:创建或替换函数 DATEADD(间隔 VARCHAR(4000),



请帮助我解决此错误下面是我的代码,在下面我的代码错误后也写了

CREATE OR REPLACE FUNCTION DATEADD (interval VARCHAR(4000), adding INT, entry_date TIMESTAMP(0))  
RETURN TIMESTAMP(0) as 
$body$ 
declare 
result TIMESTAMP(0); 
BEGIN 
If (UPPER(interval) = 'D') OR (UPPER(interval) = 'Y') OR (UPPER(interval) ='W') OR (UPPER(interval) = 'DD') OR (UPPER(interval) = 'DDD') OR (UPPER(interval) = 'DAY')  THEN result := entry_date + adding; ELSIF (UPPER(interval) = 'WW') OR (UPPER(interval) = 'IW')  OR (UPPER(interval) = 'WEEK') THEN result := entry_date + (adding * 7); ELSIF  (UPPER(interval) = 'YYYY') OR (UPPER(interval) = 'YEAR') THEN result := add_months(entry_date,adding * 12); ELSIF (UPPER(interval) = 'Q') OR (UPPER(interval) = 'QUARTER') 
THEN result := add_months(entry_date,adding * 3); 
ELSIF(UPPER(interval)= 'M') OR (UPPER(interval) = 'MM') OR (UPPER(interval) = 'MONTH') THEN 
result :=add_months(entry_date,adding); 
ELSIF  (UPPER(interval) = 'H') OR (UPPER(interval) = 'HH') OR (UPPER(interval) = 'HOUR') THEN 
result := entry_date+ (adding /24); 
ELSIF  (UPPER(interval) = 'N') OR (UPPER(interval) = 'MI') OR (UPPER(interval) = 'MINUTE') THEN 
result := entry_date+ (adding /24/60); 
ELSIF  (UPPER(interval) = 'S') OR (UPPER(interval) = 'SS') OR (UPPER(interval) = 'SECOND') THEN 
result := entry_date + (adding /24/60/60); 
END IF; 
RETURN result; 
exception when others then 
raise_application_error('-20000',sqlerrm); 
end; 
$body$ 
LANGUAGE plpgsql;

错误:语法错误在"处或附近;VARCHAR";第1行:创建或替换函数DATEADD(区间VARCHAR(4000(。。。

interval是一个保留关键字(一种数据类型(,您需要使用双引号"interval"或查找其他名称,例如,您可以使用add_interval

您可以在Postgres中为timestamp添加一个数字。您需要根据传递的值构造一个interval。最简单的方法是使用make_interval()

在PL/pgSQL中,它是returns XXX而不是return XXX

您还需要将raise_application_error('-20000',sqlerrm)替换为其他内容。但我认为混淆原始错误没有任何好处,所以我的建议是简单地完全删除异常处理程序。

您还可以使用IN而不是多个OR表达式来简化IF条件。

所以你最终得到了这样的东西:

CREATE OR REPLACE FUNCTION DATEADD (add_type text, adding INT, entry_date TIMESTAMP(0))  
RETURNS TIMESTAMP(0) as 
$body$ 
declare 
result TIMESTAMP(0); 
BEGIN 
If upper(add_type) IN ('D','Y','W','DD','DDD','DAY') THEN 
result := entry_date + make_interval(days => adding); 
ELSIF upper(add_type) IN ('WW', 'IW', 'WEEK') THEN 
result := entry_date + make_interval(weeks => adding); 
ELSIF  upper(add_type) IN ('YYYY', 'YEAR') THEN 
result := add_months(entry_date, adding * 12); 
ELSIF upper(add_type) IN ('Q', 'QUARTER') THEN  
result := add_months(entry_date, adding * 3); 
ELSIF upper(add_type) IN ('M', 'MM', 'MONTH') THEN 
result := add_months(entry_date, adding); 
ELSIF upper(add_type) IN ('H', 'HH', 'HOUR') THEN 
result := entry_date + make_interval(hours => adding); 
ELSIF upper(add_type) IN ('N', 'MI', 'MINUTE') THEN 
result := entry_date + make_interval(minutes => adding);
ELSIF upper(add_type) IN ('S', 'SS', 'SECOND') THEN 
result := entry_date + make_interval(secs => adding); 
END IF; 
RETURN result; 
end; 
$body$ 
LANGUAGE plpgsql;

最新更新