请帮助我解决此错误下面是我的代码,在下面我的代码错误后也写了
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;