Calcul de la différence de temps entre deux tuples [Résolu]

Signaler
Messages postés
30
Date d'inscription
mardi 19 avril 2005
Statut
Membre
Dernière intervention
29 septembre 2010
-
Messages postés
30
Date d'inscription
mardi 19 avril 2005
Statut
Membre
Dernière intervention
29 septembre 2010
-
Bonjour tout le monde!

Dans le cadre d'un projet pour le domaine médical,
Je dois calculer le temps moyen entre deux interventions,
mais je bloque complétement, je n'arrive pas à faire la différence seulement entre deux tuples qui ce suivent
sans la faire sur tous les autres...

voici un exemple d'une table dans laquelle je doit effectuer ce calcul:

HEURE_DEBUT          HEURE_FIN   

22/01/1997 10:51:24    22/01/1997 11:35:46
28/06/2000 10:02:23    28/06/2000 10:45:18
24/04/2007 13:31:07    24/04/2007 13:33:26
25/04/2007 11:53:25    25/04/2007 11:55:58
25/04/2007 13:01:32    25/04/2007 13:03:20
26/04/2007 09:45:26    26/04/2007 09:54:45
26/04/2007 10:28:11    26/04/2007 10:32:58
02/05/2007 11:18:43    02/05/2007 11:18:54
02/05/2007 13:09:34    02/05/2007 13:09:50
02/05/2007 13:10:24    02/05/2007 13:10:55
02/05/2007 13:14:41    02/05/2007 13:15:06
14/05/2007 15:51:28    14/05/2007 16:00:10

j'ai beaucoup cherché sur internet, mais je n'ai trouvé personne confronté au meme
probleme que moi.

si quelqu'un à une idée pour m'aiguiller je lui en serai infiniment reconnaissant

Par avance, merci.

7 réponses

Messages postés
6063
Date d'inscription
dimanche 13 avril 2003
Statut
Modérateur
Dernière intervention
15 juillet 2011
28
Si tu joue avec ta clé primaire ca doit le faire?

WHERE H1.IDINTERV = H2.IDINTERV +1
En esperant qu'il se suive?
Messages postés
6063
Date d'inscription
dimanche 13 avril 2003
Statut
Modérateur
Dernière intervention
15 juillet 2011
28
Salut

Tu peux rajouter le numero de ligne a des deux tables.

Attention c'est vraiement de la bidouille et ca doit bouffé en performance de manière importante.

a moins de creer une colonne.
Qui te numerote les lignes avant la requete,
while pas fin des enregsitrement
macolonnerownumber = i + 1

Pour la table et la tu n'as plus de trou car elles sera mis en permanence en route avant ton calcul.

NB si nbenregistrement = max(macolonnerownumber) [- 1] dependant si tu es base en base 0 ou 1 pour ton indexage de ta colonne de numero de ligne.

pas la peine de refaire l'update.

Bon courage.

Extrait d'un post google group

Si tu as une cle primaire
SELECT (SELECT Count(theField) + 1 FROM tblSource AS A WHERE A.TableID
< B.TableID) As RowNumber, TableID, theField
FROM tblSource AS B;

Sinon

Public Function LineNum(lngFldVal As Long, strSource As String, strKey
As String) As Long
Dim strCrit As String
strCrit = "[" & strKey & "] < " & CStr(lngFldVal)
LineNum = Nz(DCount(strKey, strSource, strCrit)) + 1
End Function

Then it can be called like:

SELECT LineNum([TableID],"tblSource","TableID") AS RowNumber, TableID,
theField FROM tblSource;

SELECT LineNum([QID], "qryNew", "QID") As RowNumber, * FROM qryNew;

Note: One way to get a unique QID is to use the key from a source
table (qryNew: SELECT tblSource.TableID AS QID...). I also tried an
old query I had lying around as qryNew :-):

qryNew:
SELECT qryOrdinalIPs.IP AS IP1, qryOrdinalIPs.ID
FROM tblIPs INNER JOIN qryOrdinalIPs ON tblIPs.ID = qryOrdinalIPs.ID
WHERE (((qryOrdinalIPs.theOrdinal)=1))
GROUP BY qryOrdinalIPs.IP, qryOrdinalIPs.ID;

SELECT LineNum([ID], "qryNew", "ID") As RowNumber, * FROM qryNew;
Messages postés
6063
Date d'inscription
dimanche 13 avril 2003
Statut
Modérateur
Dernière intervention
15 juillet 2011
28
Salut

Je ne comprends pas la phrase
différence seulement entre deux tuples qui ce suivent

Regardes la focntion datediff pour résoudre ton probleme de difference
Messages postés
30
Date d'inscription
mardi 19 avril 2005
Statut
Membre
Dernière intervention
29 septembre 2010

Salut nhervagault
merci d'avoir pris un peu de temp pour mon problème. et merci pour la fonction datediff que je ne connaissait pas, mais ça ne regle pas complétement mon problème. C'est vrai que je n'ai pas été très clair dans mon explication, je vais essayé d'étre plus précis
 ID INTERV      HEURE_DEBUT(HD)          HEURE_FIN  (HF)
          1               22/01/1997 10:51:24                22/01/1997 11:35:46
          2               28/06/2000 10:02:23                28/06/2000 10:45:18
          3               24/04/2007 13:31:07                24/04/2007 13:33:26
          4               25/04/2007 11:53:25                25/04/2007 11:55:58
          5               25/04/2007 13:01:32                25/04/2007 13:03:20

(c'est le meme exemple que décrit plus haut, mais avec un identifiant, ce sera plus facile)
Ce que je voudrai réaliser c'est une moyenne du temps qui sépare deux interventions soit:
    HeureDebut de l'interv 2   moins  HeureFin  de l'interv 1  
    HeureDebut de l'interv 3   moins  HeureFin  de l'interv 2
    HeureDebut de l'interv 4   moins  HeureFin  de l'interv 3    etc....
pour réaliser la moyenne de ce calcul.
Avec cette requete:
    select  DISTINCT (H1.HEURE_DEBUT) , H1.HEURE_FIN ,H2.HEURE_DEBUT, H2.HEURE_FIN,            
    cdate(H2.HEURE_DEBUT - H1.HEURE_FIN) as "Temp" 
    From  INTERVENTION as H1 INNER JOIN INTERVENTION as H2 on (H1.HEURE_DEBUT <> H2.HEURE_DEBUT)

j'ai obtenu la différence entres tous les tuples:
    HD interv2 - HF interv1
    HD interv2 - HF interv3
    HD interv2 - HF interv4 etc....
alors que je voudrai juste faire la difference entre le tuple (2 et 1), (3 et 2) etc...
(d'où ma phrase "je n'arrive pas à faire la différence seulement entre
deux tuples qui ce suivent sans la faire sur tous les autres...")
j'espère avoir été un peu plus clair.
encor merci à ceux qui consacreront un peu de temps à ce problème.
Messages postés
30
Date d'inscription
mardi 19 avril 2005
Statut
Membre
Dernière intervention
29 septembre 2010

En théorie la solution que tu ma donné marche très bien, et je n'avai  pas dutout pensé à ce genre de solution
malheureusement, je me suis aperçu que certaine intervention peuvent être effacée, et de ce fait, leur clé primaire aussi...
donc impossible de savoir si H1.IDINTERV = H2.IDINTERV +1
mais merci quand meme, ça fait deux chose que tu m'apprend ^^
(je début un peu en sql comme tu as du le remarquer)
je vais continuer à chercher, et si je trouve une solution, je la posterai ici. ça pourra peut etre aider quelqu'un (si je trouve....)
Messages postés
30
Date d'inscription
mardi 19 avril 2005
Statut
Membre
Dernière intervention
29 septembre 2010

Salut et désolé d'avoir mis autant de temps pour répondre.
Mais un GRAND merci à toi, pour le temps que tu as consacré à mon probleme, et surtout à la solution que tu m'as donnée.

avec

SELECT (SELECT Count(theField) + 1 FROM tblSource AS A
WHERE A.TableID< B.TableID) As RowNumber, TableID, theField
FROM tblSource AS B;

j'ai pu numéroter tous mes tuples avec des numéros qui se suivent , et avec

WHERE H1.IDINTERV = H2.IDINTERV +1

j'ai pu réaliser la différence de temps entre deux patients.

encor merci!!!!
Messages postés
30
Date d'inscription
mardi 19 avril 2005
Statut
Membre
Dernière intervention
29 septembre 2010

Si ça interesse quelqu'un, voila la requête que j'ai obtenu,
j'espere que ça pourra être utils pour quelqu'un bien que ce soit assé spécifique.

Select cdate(R2.HEURE_DEBUT - R1.HEURE_FIN) as 'Temp Entre deux Intervention'
from (
    Select (
        SELECT Count (HEURE_DEBUT)+  1
        FROM (
                SELECT distinct(HEURE_DEBUT), HEURE_FIN
                FROM INTERVENTION
                WHERE HEURE_DEBUT IS NOT NULL
                AND HEURE_FIN IS NOT NULL) AS H1
       WHERE H1.HEURE_DEBUT < H2.HEURE_DEBUT
    ) As IDTMP,H2.HEURE_DEBUT, H2.HEURE_FIN
    FROM(
        SELECT distinct(HEURE_DEBUT), HEURE_FIN
        FROM
        INTERVENTION
        WHERE HEURE_DEBUT IS NOT NULL
        AND HEURE_FIN IS NOT NULL) AS H2
    WHERE H2.HEURE_DEBUT IS NOT NULL
    AND H2.HEURE_FIN IS NOT NULL) as R1,
    (
    Select (
        SELECT Count (HEURE_DEBUT)+  1
        FROM (
                SELECT distinct(HEURE_DEBUT), HEURE_FIN
                FROM INTERVENTION
                WHERE HEURE_DEBUT IS NOT NULL
                AND HEURE_FIN IS NOT NULL) AS H1
        WHERE H1.HEURE_DEBUT < H2.HEURE_DEBUT
    ) As IDTMP,H2.HEURE_DEBUT, H2.HEURE_FIN
    FROM(
        SELECT distinct(HEURE_DEBUT), HEURE_FIN
        FROM
        INTERVENTION
        WHERE HEURE_DEBUT IS NOT NULL
        AND HEURE_FIN IS NOT NULL) AS H2
    WHERE H2.HEURE_DEBUT IS NOT NULL
    AND H2.HEURE_FIN IS NOT NULL) AS R2

WHERE R1.IDTMP+1 = R2.IDTMP

Bon Courage à tous!!