语法错误在或附近","

时间:2017-05-31 04:49:07

标签: postgresql function if-statement plpgsql

我对此功能有疑问,无法弄清楚如何修复它。

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;

我真的不明白这有什么问题。

1 个答案:

答案 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.

但那无关紧要。要获得一年中的季度,请在简单表达式中使用字段说明符QUARTERdate_part() or EXTRACT()

EXTRACT(QUARTER FROM $timestamp)

EXTRACTdate_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