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

syntax error at or near "VARCHAR" LINE 1: CREATE OR REPLACE FUNCTION DATEADD (interval 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;