我对此功能有疑问,无法弄清楚如何修复它。
Create Function Quy(sdate timestamp)
returns integer as $$
declare
numbmonth integer;
quy integer;
Begin
numbmonth := Date_part('month',sdate);
If numbmonth < 4 then
quy := 1;
else if numbmonth < 7 then
quy := 2;
else if numbmonth < 10 then
quy := 3;
else quy := 4;
return quy;
END;
$$
LANGUAGE plpgsql;
当我尝试运行代码时会发生这种情况:
ERROR: syntax error at or near ";" LINE 16: END;
我真的不明白这有什么问题。
答案 0 :(得分:3)
多个语法错误。该功能将如下工作:
CREATE OR REPLACE FUNCTION quy(sdate timestamp)
RETURNS integer AS
$func$
DECLARE
numbmonth integer := date_part('month', sdate);
quy integer;
BEGIN
IF numbmonth < 4 THEN
quy := 1;
ELSIF numbmonth < 7 THEN
quy := 2;
ELSIF numbmonth < 10 THEN
quy := 3;
ELSE
quy := 4;
END IF;
RETURN quy;
END
$func$ LANGUAGE plpgsql;
Consult the manual for the basic syntax of IF
.
但那无关紧要。要获得一年中的季度,请在简单表达式中使用字段说明符QUARTER
和date_part()
or EXTRACT()
:
EXTRACT(QUARTER FROM $timestamp)
EXTRACT
是date_part()
的标准SQL等价物
如果您需要(double precision
),则返回integer
,然后转换为::int
。
如果你还需要一个功能:
CREATE OR REPLACE FUNCTION quy(sdate timestamp)
RETURNS int LANGUAGE sql IMMUTABLE AS
'SELECT EXTRACT(QUARTER FROM $1)::int';
$1
是对第一个函数参数的引用。相当于示例中的sdate
。 $
- 符号适用于Postgres的任何版本,而SQL函数中的命名参数引用仅在Postgres 9.2中引入。参见:
dbfiddle here