2017-05-31 12 views
-1

この機能に問題があり、修正方法を理解できませんでした。構文エラーまたはその付近 "、"

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

削除しようとしました。 ENDの後に? – Jan

答えて

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.

しかし、それは空騒ぎだ:関数は次のように動作します。今年の四半期を取得するには、簡単な式でdate_part() or EXTRACT()を持つフィールド指定子QUARTERを使用します。

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と等価です。 $ -notationはどのバージョンのPostgresでも動作しますが、SQL関数の名前付きパラメータ参照はPostgres 9.2でのみ導入されました。参照:

dbfiddle here

+0

最初の関数は最後の行に構文エラーがあり、2番目の関数は5を返し、datep_partの$ 1を説明することができますか?私はSQLで初心者です。 –

+0

@ Mr.X:申し訳ありませんが、単純な関数の式にバグがありました。それを私が直した。しかし、最初の構文エラー?私はそうは思わない。デモを参照してください:http://dbfiddle.uk/?rdbms=postgres_9.6&fiddle=8d39a48305ac72031b6f4c09883414b9あなたのPostgresのバージョンに関連する質問を常に*与える*べきです。 –

+0

ご協力いただきありがとうございます。今はうまくいきます。 –

関連する問題