banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#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)


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

Hors ligne

 

#7 Wed 09 April 2008 13:26

MathieuB
Membre du bureau
Lieu: Montpellier
Date d'inscription: 18 Jan 2006
Messages: 1233
Site web

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

Hors 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

MathieuB
Membre du bureau
Lieu: Montpellier
Date d'inscription: 18 Jan 2006
Messages: 1233
Site web

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

Hors 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

 

Pied de page des forums

Powered by FluxBB