PostgreSQL date de différence
J'ai un PostgreSQL fonction qui calcule la date de différence:
CREATE OR REPLACE FUNCTION testDateDiff () RETURNS int AS $BODY$
DECLARE startDate TIMESTAMP;
DECLARE endDate TIMESTAMP;
DECLARE diffDatePart int ;
BEGIN
Select evt_start_date From events Where evt_id = 5 INTO startDate ;
Select evt_start_date From events Where evt_id = 6 INTO endDate ;
SELECT EXTRACT(day FROM TIMESTAMP startDate - endDate) INTO diffDatePart;
RETURN diffDatePart;
END;
$BODY$
LANGUAGE plpgsql
COST 100
Si des dates sont déduites directement alors la différence est calculée. Mais dans mon cas, les dates sont présents dans des variables comme startDate
et endDate
, ce qui provoque le problème.
Comment puis-je soustraire les dates contenues dans des variables?
Si vous avait fourni le message d'erreur de syntaxe que vous inévitablement pour la définition de cette fonction, il aurait été plus facile. Même si ça n'a pas de sens pour vous, au moins, nous permet d'écarter d'autres suspects.
OriginalL'auteur Satish Sharma | 2012-12-28
Vous devez vous connecter pour publier un commentaire.
Debug
Ce que votre fonction est de faire pourrait être fait beaucoup plus simple. La cause réelle de l'erreur de syntaxe est ici:
On dirait que vous êtes en train de jeter
startDate
àtimestamp
, ce qui est absurde pour commencer, parce que votre paramètrestartDate
est déclarée commetimestamp
déjà.Il ne fonctionne pas. Je cite le manuel ici:
Il serait fonctionne comme ceci:
Mais cela n'a pas beaucoup de sens. Vous parlez des "dates", mais encore définir vos paramètres comme
timestamp
. Vous pourrait désinfecter ce que vous avez comme ceci:DECLARE
seulement besoin une fois.date
colonnes déclaré que le bon type dedate
.@
.Depuis soustrayant dates (par opposition à la soustraction horodateurs, ce qui donne un
interval
) déjà rendementsinteger
, simplifier pour:Ou encore plus simple que plpgsql affectation:
Simple requête
Vous pouvez résoudre la tâche simple avec une simple requête à l'aide d'une sous-requête:
Ou vous pourriez
CROSS JOIN
la table de base à lui-même (1 ligne de chaque instance, de sorte que c'est ok):De la fonction SQL
Si vous insistez sur une fonction pour le but, l'utilisation d'une simple fonction sql:
Appel:
Fonctions PL/pgSQL
Si vous insistez sur la plpgsql ...
Même appel.
OriginalL'auteur Erwin Brandstetter
Je voudrais écrire la requête comme ceci:
La différence entre l'utilisation de
:=
etinto
dans le contexte ci-dessus est que l'utilisation de:=
votre requête doit retourner une valeur unique. Si vous utilisezinto
votre requête peut retourner une seule ligne (c'est à dire plus d'une colonne).Pour une explication complète de l'utilisation de
select
avecinto
et plpgsql vous devriez lire http://www.postgresql.org/docs/9.1/static/plpgsql-statements.html. Plus précisément, l'article 39.5.3 de la documentation PostgreSQL.SELECT INTO
fonctionne très bien. Il y a un certain nombre d'autres problèmes ici.Si vous avez le temps, quels sont les autres problèmes? Alors je peux comprendre où je tort, je l'apprécierais. Je vois maintenant pourquoi les OP de la syntaxe de la
select into
n'était pas mauvais.Désolé, ma dernière remarque était ambiguë. Je ne voulais pas dire plus de problèmes dans votre réponse, mais plus de problèmes dans le cas des OP code. J'ai traité avec qui beaucoup dans ma réponse. Aussi, enlevé mon downvote maintenant, depuis que vous avez supprimé de la désinformation.
OriginalL'auteur fbynite
Avez-vous vraiment besoin d'une fonction pour ça?
Cette requête serait de travailler ainsi:
OriginalL'auteur Borys