2017-05-31 2 views
-1

J'ai des problèmes avec cette fonction et je n'ai pas réussi à résoudre le problème.Erreur de syntaxe à ou près de ","

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; 

Cela se produit lorsque je tente d'exécuter le code:

ERROR: syntax error at or near ";" 
LINE 16: END; 

Je ne comprends vraiment pas ce qui est mal à cela.

+0

J'ai essayé de retirer le; après END? – Jan

Répondre

3

Plusieurs erreurs de syntaxe. La fonction fonctionnerait comme ceci:

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.

Mais ce qui est beaucoup de bruit pour rien. Pour obtenir le trimestre de l'année utiliser le champ spécificateur QUARTER avec date_part() or EXTRACT() dans une simple expression:

EXTRACT(QUARTER FROM $timestamp) 

EXTRACT est l'équivalent standard SQL de date_part().
L'une ou l'autre renvoie double precision, alors transtypé en integer si vous en avez besoin (::int).

Si vous avez besoin d'une fonction:

CREATE OR REPLACE FUNCTION quy(sdate timestamp) 
    RETURNS int LANGUAGE sql IMMUTABLE AS 
'SELECT EXTRACT(QUARTER FROM $1)::int'; 

$1 est la référence au paramètre 1er fonction. Équivalent à sdate dans l'exemple. $ -notation fonctionne dans n'importe quelle version de Postgres, tandis que les références de paramètres nommés dans les fonctions SQL ont été introduites seulement avec Postgres 9.2. Voir:

dbfiddle here

+0

la première fonction a une erreur de syntaxe dans la dernière rangée, la seconde a un retour de résultat 5, et pouvez-vous expliquer le $ 1 dans datep_part pour moi? Je suis débutant dans SQL –

+0

@ Mr.X: Désolé, l'expression dans la fonction simple avait un bug. Je l'ai corrigé. Mais erreur de syntaxe dans le premier? Je ne pense pas. Voir la démo: http://dbfiddle.uk/?rdbms=postgres_9.6&fiddle=8d39a48305ac72031b6f4c09883414b9 Vous devriez * toujours * fournir votre version de Postgres avec n'importe quelle question connexe. –

+0

je vous remercie beaucoup pour votre aide, ça marche bien maintenant –