[PL/pgSQL] Soustraire un interval à un timest

Résolu/Fermé
Yoan Messages postés 11795 Date d'inscription mardi 1 février 2005 Statut Modérateur Dernière intervention 10 décembre 2023 - 20 janv. 2009 à 18:57
Yoan Messages postés 11795 Date d'inscription mardi 1 février 2005 Statut Modérateur Dernière intervention 10 décembre 2023 - 22 janv. 2009 à 23:15
Bonjour,

Je souhaiterais soustraire un élément de type interval à un timestamp sous PL/pgSQL (avec un résultat de type timestamp).
Ceci fonctionne très bien avec des valeurs fixes, par exemple (selon la doc) :
SELECT timestamp '2001-09-28 23:00' - interval '23 hours';

Mais si je veux opérer sur les nuplets tirés de la base, ça va tout de suite moins bien. Ceci ne marche pas, mais il traduit bien l'idée de ce que je voudrais faire :
SELECT timestamp date_arrivee - interval temps_de_course minutes AS date_depart
FROM course
WHERE id_course=1111;

Il me signale une erreur de syntaxe près de "date_arrivee". J'ai essayé quotes et parenthèses dans tous les sens, mais pas moyen de lui faire entendre que date_arrivee et temps_de_course sont des noms d'attributs. Sur la doc il n'y a que des exemples avec des valeurs "fixes".

Merci de votre aide.

1 réponse

Yoan Messages postés 11795 Date d'inscription mardi 1 février 2005 Statut Modérateur Dernière intervention 10 décembre 2023 2 330
22 janv. 2009 à 17:53
Bon j'ai changé le type de durée_course en type INTERVAL(3).
Le problème c'est que la durée des courses est calculée automatiquement par un trigger. Il faut maintenant que je convertisse (dans le trigger) le résultat du calcul de durée_course en INTERVAL.

Toujours le même problème donc. Avec une valeur "fixe" ça fonctionne :
CREATE FUNCTION calcul_durée() RETURNS trigger AS '
BEGIN
UPDATE course
SET durée= (SELECT INTERVAL ''5 minutes'')
WHERE id_course=old.id_course;
RETURN new;
END
'LANGUAGE 'plpgsql';
Mais dès que je lui fais faire le calcul avec les vraies valeurs ça foire :
CREATE FUNCTION calcul_durée() RETURNS trigger AS '
BEGIN
UPDATE course
SET durée= (SELECT INTERVAL sum(durée_étape) WHERE ... etc)
WHERE id_course=old.id_course;
RETURN new;
END
'LANGUAGE 'plpgsql';

Sinon il est bel et bien d'accord pour faire un timestamp-interval. Encore faut-il que j'obtienne l'interval ....

Merciche :-)
0
Yoan Messages postés 11795 Date d'inscription mardi 1 février 2005 Statut Modérateur Dernière intervention 10 décembre 2023 2 330
22 janv. 2009 à 23:15
Ayé, trouvé !

Ceci fonctionne :
UPDATE course
SET durée=(SELECT sum(durée_étape)* interval '1 minute' FROM ect ...)
WHERE id_course=old.id_course;
Ceci fait que la somme des "durée_étape" [i.e. un entier] est multipliée par un intervalle, et ça psql sait le faire : le résultat est un intervalle.

;-)
0