"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;
请帮我解决这个错误 以下是我的代码,在我的代码错误之后也写了
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;