#1 Mon 07 April 2008 09:50
- Y.info
- Participant occasionnel
- Lieu: Tunis
- Date d'inscription: 19 Oct 2007
- Messages: 34
SQL diffrence entre deux temps
Bonjour,
j'ai contruit une table (position) qui contient les differentes positions des voitures contenant les colonnes suivants: nom_voiture, etat_voiture(active ou inactive), latitude, longitude, vitesse, date, heure.
je veux calculer le temps de conduite d'une voiture entre deux dates a l'aide d'une requete SQL. càd le temps ecoulé entre deux dates(ou deux heures) sachant que l'etat du voiture est active,
Avez-vous une idée comment faire ça?
Sachant que je travail avec postgresql 8.2.5, et postgis 1.3
Merci d'avance.
Cordialement
Y.info
Dernière modification par Y.info (Mon 07 April 2008 09:56)
Hors ligne
#2 Mon 07 April 2008 12:30
- Y.info
- Participant occasionnel
- Lieu: Tunis
- Date d'inscription: 19 Oct 2007
- Messages: 34
Re: SQL diffrence entre deux temps
J'ai essayé avec la requette suivante:
SELECT date,max (vitesse),avg (vitesse),min (heure),max(heure),(max(heure)-min(heure)) from positions where ((date between '"+datedebut+"' AND '"+datefin+"')AND (etat_voiture='active')AND(nom='"+nom_voiture+"')) GROUP BY date ;
Elle affiche le resultat mais elle ne prend pas en consideartions de l'etat du voiture, càd elle calcule le temps ecoulé entre la date de debut et la date de fin, sans pris en charge des periodes d'inactivité du voiture.
Quelqu'un peut m'aider?
Dernière modification par Y.info (Mon 07 April 2008 12:31)
Hors ligne
#3 Mon 07 April 2008 14:28
- Cartosig
- Participant assidu
- Date d'inscription: 16 Oct 2006
- Messages: 222
Re: SQL diffrence entre deux temps
Je pense qu'il n'y a pas d'autre solution que de soustraire la somme des périodes d'inactivité à la durée totale.
Pour cela il faut créer une sous-requête (affectée à un alias par commodité) qui va permettre de calculer cette durée d'inactivité, et englober toute la requete dans une requete mère qui permettra de faire la soustraction temps actif - temps inactif.
En gros ca doit donner quelque chose comme ça :
select *tous les champs qui vous interessent*, (temps_total - temps_inactif) from (SELECT A.date, A.max(vitesse), A.avg(vitesse), A.min(heure) , A.max(heure), (A.max(heure) - A.min(heure)) as temps_total, B.temps_inactif from positions A, (*requête qui ramène le temps inactif pour la voiture voulue*) B where ((date between '"+datedebut+"' AND '"+datefin+"')AND (etat_voiture='active')AND(nom='"+nom_voiture+"')) GROUP BY date) ;
Dernière modification par Cartosig (Mon 07 April 2008 14:29)
Hors ligne
#4 Mon 07 April 2008 17:50
- Y.info
- Participant occasionnel
- Lieu: Tunis
- Date d'inscription: 19 Oct 2007
- Messages: 34
Re: SQL diffrence entre deux temps
Merci Mr.Cartosig tout d'abord pour votre réponse,
Pouvez vous m'expliquez un peu plus cette requete, elle me semble un peu compliqué (c'est quoi le A et le B?...)
Dernière modification par Y.info (Mon 07 April 2008 18:04)
Hors ligne
#5 Mon 07 April 2008 18:20
- Cartosig
- Participant assidu
- Date d'inscription: 16 Oct 2006
- Messages: 222
Re: SQL diffrence entre deux temps
Ce sont des alias, on les place à la suite d'un nom de table ou d'un select entre parathèses pour faire référence à cet élément.
Hors ligne
#6 Tue 08 April 2008 10:43
- Y.info
- Participant occasionnel
- Lieu: Tunis
- Date d'inscription: 19 Oct 2007
- Messages: 34
Re: SQL diffrence entre deux temps
Je Veux contruire une requete qui permet de calculer le temps de conduite du 2008/04/02 (voir table).
j'ai pas une grande idée sur les alias, j'ai essayé mais j'ai pas arrivé,
quelqu'un peut m'aider?
vous trouvez ci-jointe un exemple de ma table positions,
La requete doit caculer seulement la somme des périodes où l'etat du voiture est active.
Avez vous une idée?
Dernière modification par Y.info (Tue 08 April 2008 11:08)
Hors ligne
#7 Wed 09 April 2008 13:26
Re: SQL diffrence entre deux temps
Bonjour,
je n'ai pas réfléchi à une solution SQL mais j'ai voulu créer une fonction plpgsql :
Tri des lignes par heure croissante pour la date donnée (paramètre de la fonction).
Pour chaque ligne, si l'état précédent était "active", on ajoute l'intervalle entre les deux ligne à la durée totale d'activité.
création et remplissage de ma table
Code:
CREATE TABLE "temp" ( id serial NOT NULL, etat character varying(10), date date, heure time without time zone, CONSTRAINT pk PRIMARY KEY (id) ) WITH (OIDS=FALSE); ALTER TABLE "temp" OWNER TO dba; INSERT INTO temp (id, etat, date, heure) VALUES (1, 'active', '2008-02-28', '08:30:00'); INSERT INTO temp (id, etat, date, heure) VALUES (2, 'active', '2008-02-28', '08:45:00'); INSERT INTO temp (id, etat, date, heure) VALUES (3, 'inactive', '2008-02-28', '10:00:00'); INSERT INTO temp (id, etat, date, heure) VALUES (4, 'active', '2008-02-28', '10:30:00'); INSERT INTO temp (id, etat, date, heure) VALUES (5, 'inactive', '2008-02-28', '10:45:00');
Création de la fonction :
Code:
CREATE OR REPLACE FUNCTION duree_activite(date) RETURNS time without time zone AS $BODY$ DECLARE date_act alias for $1; myrec RECORD; var_heure_debut_phase time; var_heure_courante time; var_duree_activite interval; var_etat_courant text; var_etat_precedent text; var_duree_phase interval; BEGIN var_duree_activite:='00:00:00'; var_duree_phase:='00:00:00'; FOR myrec IN SELECT id, etat, date, heure FROM "temp" where date=date_act LOOP var_etat_courant:=myrec.etat; var_heure_courante:=myrec.heure; RAISE NOTICE 'début de phase : %', var_heure_debut_phase ; RAISE NOTICE 'état de la phase : %', var_etat_precedent ; RAISE NOTICE '->heure courante (fin de phase) : %', var_heure_courante ; IF var_etat_precedent='active' THEN var_duree_activite:=var_duree_activite+(var_heure_courante-var_heure_debut_phase); END IF; var_duree_phase:=var_heure_courante-var_heure_debut_phase; var_heure_debut_phase:=var_heure_courante; var_etat_precedent:=var_etat_courant; RAISE NOTICE 'durée de la dernière phase : %', var_duree_phase ; RAISE NOTICE 'durée de l''activité journalière : %', var_duree_activite; END LOOP; RETURN var_duree_activite; END; $BODY$ LANGUAGE 'plpgsql' VOLATILE
Code:
select duree_activite('2008-02-28');
retourne 01:45:00
J'espère que ça vous aidera,
Mathieu BOSSAERT.
Dernière modification par Mathieu BOSSAERT (Wed 09 April 2008 13:27)
Mathieu BOSSAERT
Association GeoRezo
En ligne
#8 Thu 10 April 2008 12:31
- Y.info
- Participant occasionnel
- Lieu: Tunis
- Date d'inscription: 19 Oct 2007
- Messages: 34
Re: SQL diffrence entre deux temps
Bonjour,
j'ai un programme en jsp qui connecte à la base de données postgresql pour selectionner les differents données (date, heure vitesse....) a l'aide d'une requete SQL,
Comment je peux intégrer la fonction plpgsql dans un code jsp et peut on calculer le temps d'activité a l'aide d'une requete SQL?
Hors ligne
#9 Thu 10 April 2008 15:31
Re: SQL diffrence entre deux temps
Bonjour,
je n'ai aucune compétence en jsp, mais si votre fonction a été créée sur le serveur postgresql, une requête telle que "select duree_activite('2008-02-28')" vous retourneras le résultat de la fonction (un valeur de type time without timezone), comme s'il s'agissait d'un attribut.
Je ne me suis pas penché sur la solution SQL.
Mathieu B.
Dernière modification par Mathieu BOSSAERT (Thu 10 April 2008 15:32)
Mathieu BOSSAERT
Association GeoRezo
En ligne
#10 Sat 12 April 2008 09:04
- Y.info
- Participant occasionnel
- Lieu: Tunis
- Date d'inscription: 19 Oct 2007
- Messages: 34
Re: SQL diffrence entre deux temps
Bonjour,
J'ai un probleme d'integration de la fonction plpgsql dans un code jsp(ou java), es ce que je dois l'integrer comme une fonction javascript? j'ai aussi d'autres champs a selectionner (date, heure, vitesse..) donc j'ai utilisé une requete SQL pour le calcul de ces champs qui est la suivante:
SELECT date,max (vitesse),avg (vitesse),min (heure),max(heure) from positions where ((date between '"+datedebut+"' AND '"+datefin+"')AND(nom='"+nom_voiture+"')) GROUP BY date ;
Ya t'il une solution SQL qui permettera de calculer la durée d'activité?
Qu'es ce je dois ajouter à cette requete pour qu'elle affiche aussi le temps d'activité d'une voiture?
Quelqu'un a une idée?
Merci d'avance.
Dernière modification par Y.info (Sat 12 April 2008 09:18)
Hors ligne