IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes et SQL. Discussion :

DateDiff sur des champs consecutifs


Sujet :

Requêtes et SQL.

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 22
    Points : 7
    Points
    7
    Par défaut DateDiff sur des champs consecutifs
    Bonjour, j'ai besoin de vos lumières.

    J'ai une table qui regroupe les marches et les arrets d'une machine :

    DateHeure - Evt - Motif
    16/01 08:00 - Demarrage - ""
    16/01 08:30 - Arret - Defaut
    16/01 09:00 - Demarrage - ""
    16/01 10:00 - Arret - ArretOperateur
    17/01 08:00 - Demarrage - ""
    17/01 10:00 - Arret - ArretOperateur
    ....

    Le motif du demarrage est toujours vide, et le motif de l'arret varie entre 5 ou 6 motifs.

    Mon But:
    Je voudrais faire une requete faisant le bilan de la journée:

    Date - TpsMarche - TpsArretTotal - TpsArretDefaut - TpsArretOperateur
    16/01 - 1h30 - 30 - 30 - 0
    17/01 - 2h - 0 - 0 - 0

    Mon problème:
    Mon premier probleme est que je ne sais pas comment faire une datediff sur deux champs consecutifs. On verra les autres problemes par la suite.

    Merci pour vos réponses

  2. #2
    Expert confirmé
    Avatar de vodiem
    Homme Profil pro
    Vivre
    Inscrit en
    Avril 2006
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Vivre
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 895
    Points : 4 325
    Points
    4 325
    Par défaut
    salut,
    il va te falloir soit une fonction soit une sous requete pour faire cela.

    une question idiote:
    après un Démarrage tu auras toujours un seul Arrêt et pas d'autre Démarrage...?

  3. #3
    Expert confirmé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 419
    Points : 4 297
    Points
    4 297
    Par défaut
    si tu fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select a.dateheure, a.evt from matable, 
    (select max(dateheure) from matable where dateheure<a.dateheure) 
    from matable as a;
    tu devrais pas tarder à t'en sortir

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 22
    Points : 7
    Points
    7
    Par défaut
    Oui, il y a toujours un arret par demarrage et vice-versa.

    Je precise, il ne peux y avoir que "demarrage" ou "arret" dans la colonne evenement.

  5. #5
    Expert confirmé
    Avatar de vodiem
    Homme Profil pro
    Vivre
    Inscrit en
    Avril 2006
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Vivre
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 895
    Points : 4 325
    Points
    4 325
    Par défaut
    en fait random voulait écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select a.dateheure, a.evt, 
    (select max(dateheure) from matable where dateheure<a.dateheure) 
    from matable as a;
    moi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select a.dateheure as debut, a.evt, (select min(dateheure)
    from matable where dateheure>a.dateheure) as fin
    from matable as a;
    à peu de chose près c'est la même chose.

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 22
    Points : 7
    Points
    7
    Par défaut
    ca a l'air pas mal, meme si j'ai du mal à comprendre la logique.

    J'ai rajouté un distinct ...et oui fallait bien que je travaille ;-)

    C'est pratiquement nickel avec ta methode vodiem, meme si la derniere ligne de la colonne fin est vide.

    Faut que je medite la dessus, aie j'ai mal à la tête.
    En tout cas, merci à vous deux.
    Je vous recontacte demain si je n'ai toujours pas résolu mon problème.

  7. #7
    Expert confirmé
    Avatar de vodiem
    Homme Profil pro
    Vivre
    Inscrit en
    Avril 2006
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Vivre
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 895
    Points : 4 325
    Points
    4 325
    Par défaut
    alors médite sur des nouvelles fraiches:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select a.dateheure as debut, a.evt,
    (select min(dateheure) from matable where dateheure>a.dateheure) as fin,
    (select min(DateDiff("n",a.dateheure,dateheure)) from matable where dateheure>a.dateheure) as duree
    from matable as a;
    oui mes résultats donne l'arret sur le démarrage, alors que random donne le début sur l'arret.
    c'est du kif kif bourico...

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 22
    Points : 7
    Points
    7
    Par défaut
    Ca y est j'ai medité...
    Au fait, des selects imbriqués, c'est comme deux boucles for imbriquées, non?

    Par contre pour le date diff, j'ai pas compris pourquoi tu faisais un autre select.

    Moi j'ai fait comme ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT a.Dateheure AS debut, a.Evt, 
    (select min(dateheure) from matable where dateheure>a.dateheure) AS fin, 
    DateDiff("n",[debut],[fin]) AS duree
    FROM matable AS a;
    Y a-t-il une difference de resultats?de performances
    Merci encore en tous cas

  9. #9
    Expert confirmé
    Avatar de vodiem
    Homme Profil pro
    Vivre
    Inscrit en
    Avril 2006
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Vivre
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 895
    Points : 4 325
    Points
    4 325
    Par défaut
    des selects imbriqués, c'est comme deux boucles for imbriquées
    on pourrais voir ca comme ca...

    Par contre pour le date diff, j'ai pas compris pourquoi tu faisais un autre select.
    parceque si tu ne veux pas faire apparaitre [fin]; puisque c'est qu'une valeur intermédiaire dont tu n'auras pas l'usage, il te fallait la syntaxe pour DiffDate sans [fin] qui comme tu vois ne s'utilise pas pareil car dans l'imbrication il te faut une fonction d'agrégat.

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 22
    Points : 7
    Points
    7
    Par défaut
    OK merci,

    Par contre, je viens de m'apercevoir que sur une fausse manip de l'operateur (assez rare mais genante) j'ai de temps en temps plusieurs start et stop d'affilés. Je sais, sais tu me l'avais bien demandé mais je me suis trompé, j'avais pas tout regarder.

    est-ce qu'il est possible de supprimer les evt similaires consecutifs ? Ou faut-il carrement faire du VBA

  11. #11
    Expert confirmé
    Avatar de vodiem
    Homme Profil pro
    Vivre
    Inscrit en
    Avril 2006
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Vivre
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 895
    Points : 4 325
    Points
    4 325
    Par défaut

    Je sais, sais tu me l'avais bien demandé mais je me suis trompé


    je m'en doutais: aucune saisie n'est parfaite, il t'aurais fallu des controles en amonts que rarement on met en place: c'est déjà assez compliqué sans ca. surtout quand on ne voit pas l'utilité...

    est-ce qu'il est possible de supprimer les evt similaires consecutifs
    oui si c'est bien des erreurs il est possible de supprimer ces doublons, regarde du coté de l'assistant de requete, mais le prb est il possible de déterminer de facon sur l'enregistrement à conserver?
    il serait peut-être ainsi possible de les ignorés dans l'imbrication.

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 22
    Points : 7
    Points
    7
    Par défaut
    Bonjour,

    Pour éviter le problème des doublons, j'ai finalement opté pour une nouvelle méthode de saisie (plus propre meme si plus lourde dans mon appli)

    DateTimeStart | DateTimeStop | MotifArret | NomProduit

    Je passe par une requete intermédiare, avec la méthode que vous m'avez appris hier pour calculer les temps d'arrêts entre deux marches.

    Je me retrouve face à deux problèmes:

    1 La requête finale est une requete d'analyse croisée sur la requete intermediaire, mais access ne l'accepte pas, il a probleme avec un des champs de la requete intermédaire.

    2 J'ai un problème avec le GROUP BY
    Je vous explique, voici une exemple de la table d'origine
    27/09/2007 08:00 | 27/09/2007 10:00 | Panne | Produit1
    27/09/2007 11:00 | 27/09/2007 12:00 | Pause | Produit1
    27/09/2007 13:00 | 27/09/2007 14:00 | Casse | Produit2
    27/09/2007 15:00 | 27/09/2007 17:00 | ArretProd | Produit1

    J'aimerai avoir dans un premier temps le bilan suivant
    Jour | NomProduit | HeureDebut | HeureFin | TpsMarche | TpsArret
    27/09 | Produit 1 | 08:00 | 12:00 |....
    27/09 | Produit 2 | 13:00 | 14:00 |....
    27/09 | Produit 1 | 15:00 | 17:00 |....

    Or moi, je n'arrive qu'a faire un group by sur le jour et le produit ce qui donne
    27/09 | Produit 1 | 08:00 | 17:00 |....
    27/09 | Produit 2 | 13:00 | 14:00 |....
    Pas cool.

    Voila c'est long mais c'est bon

    Je vous joint un fichier exemple si ca vous tenteLineEvt.zip

  13. #13
    Expert confirmé
    Avatar de vodiem
    Homme Profil pro
    Vivre
    Inscrit en
    Avril 2006
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Vivre
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 895
    Points : 4 325
    Points
    4 325
    Par défaut
    tu veux faire un regroupement sur les NomProduits qui sont consécutif?

  14. #14
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 22
    Points : 7
    Points
    7
    Par défaut
    Oui, je voudrais regrouper par jour et par "production" (en terme de période)
    je voudrais savoir que j'ai produit le produit1 de 8h à 12h puis le produit2 de 13h à 14 h, puis le produit1 de 15h à 17h
    Parce qu'actuellement, avec mon regroupent, l'utilisateur voit qu'il a produit de produit1 de 8h à 17h, ce qui n'est pas vrai!

  15. #15
    Expert confirmé
    Avatar de vodiem
    Homme Profil pro
    Vivre
    Inscrit en
    Avril 2006
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Vivre
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 895
    Points : 4 325
    Points
    4 325
    Par défaut
    ouf..., bon ok, voilà c'est fait:

    pour la Rqt_intermediaire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT LineEvt_0.Debut, LineEvt_0.Fin, LineEvt_0.NomProduit, DateDiff("n",[debut],[fin]) AS TpsMarche, (DateDiff("n",Fin,(Select first(Debut) from LineEvt as LineEvt_1 where format(debut,"dd-mm-yyyy")=format(LineEvt_0.debut,"dd-mm-yyyy") and debut>LineEvt_0.debut))) AS TpsArret, LineEvt_0.MotifArret, (select first(debut) from LineEvt as LineEvt_2 where debut>nz((select last(debut) from LineEvt as LineEvt_3 where ([NomProduit]<>LineEvt_0.NomProduit) and (debut<=LineEvt_0.Debut) ),0)) AS DebutCycle
    FROM LineEvt AS LineEvt_0
    ORDER BY LineEvt_0.Debut;
    pour la Rqt_Finale:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT Format([Debut],"dd-mm-yyyy") AS [Date], First(Format([Debut],"Short Time")) AS HDebut, Last(Format([Fin],"Short Time")) AS HFin, Rqt_intermediaire.NomProduit, Sum(Rqt_intermediaire.TpsMarche) AS SommeDeTpsMarche, Sum(Rqt_intermediaire.TpsArret) AS SommeDeTpsArret, Rqt_intermediaire.DebutCycle
    FROM Rqt_intermediaire
    GROUP BY Format([Debut],"dd-mm-yyyy"), Rqt_intermediaire.NomProduit, Rqt_intermediaire.DebutCycle
    ORDER BY Rqt_intermediaire.DebutCycle;
    Attention: tu trouveras un NomProduit sur deux lignes s'il est sur deux jours différents même si l'enregistrement et consécutif mais je pense que c'est que tu recherches.

  16. #16
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 22
    Points : 7
    Points
    7
    Par défaut
    oui, oui, c'est tout a fait ce que je cherche. Très astucieux et pas facile du tout. je n'aurai jamais trouvé tout seul, ou peut être dans dix ans.

    Il faut que je remedite...Mille fois merci

    Une dernière pour la route, c'est promis, après je te fous la paix:
    As tu essayé d'executer la requete analyse croisée et sais tu pourquoi access ne l'accepte pas? Est-ce à cause des select imbriqués non reconnus dans access?

  17. #17
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 22
    Points : 7
    Points
    7
    Par défaut
    Bonjour,

    Je viens d'exporter mes requêtes sous access2007 et j'ai l'impression que access 2007 n'est pas capable de traiter des requêtes imbriquées du type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select a.dateheure as debut, a.evt, (select min(dateheure)
    from matable where dateheure>a.dateheure) as fin
    from matable as a;
    Il me met qu'il ne reconnait pas a.dateheure.

    C'etait le cas sous access 2000 uniquement sur des requetes croisées.

    Quelqu'un aurait une astuce?

  18. #18
    Expert confirmé
    Avatar de vodiem
    Homme Profil pro
    Vivre
    Inscrit en
    Avril 2006
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Vivre
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 895
    Points : 4 325
    Points
    4 325
    Par défaut
    salut Psykauz,

    sur access 2002 SP2, ta requete fonctionne bien.

    As tu essayé d'executer la requete analyse croisée et sais tu pourquoi access ne l'accepte pas?
    oui et je n'ai pas trouvé la cause. j'ai bien rajouter le type dans les paramètres de la requete mais ca bloque après dans le groupement.
    je te conseil d'ouvrir une nouvelle discution là-dessus. désolé

  19. #19
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 22
    Points : 7
    Points
    7
    Par défaut
    Salut Vodiem,

    Avant d'ouvrir un nouveau post, n'existe-il pas un autre moyen qu'un select imbriqué avec comparaison sur deux tables pour avoir

    DateDebut | DateFin | DateDebut (N+1)

    En gros ce qu'il me faudrait (meme si ca n'existe pas) c'est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select a.datedebut, a.datefin, (select Second(DateDebut)
    from matable as b) as ProchainDebut
    from matable as a;
    Et là je pense qu'access 2007 accepterait

  20. #20
    Expert confirmé
    Avatar de vodiem
    Homme Profil pro
    Vivre
    Inscrit en
    Avril 2006
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Vivre
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 895
    Points : 4 325
    Points
    4 325
    Par défaut
    non en sql seul l'imbrication te permet cela,
    tu as essayé avec exactement la requete que tu as posté? ou tu as ta propre requete, dans ce cas post la: il y a peut être un autre pb.

    sinon: ben oui, il y a toujours une autre solution
    passer par une fonction public qui recherchera la valeur suivante que tu appel dans ta requete.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 6
    Dernier message: 01/06/2006, 15h11
  2. requêtes sur des champs date
    Par wiwi dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 03/02/2006, 14h14
  3. calcul sur des champs
    Par Tierisa dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 20/01/2006, 12h55
  4. tri sur des champs calculés
    Par Thib dans le forum Bases de données
    Réponses: 10
    Dernier message: 18/10/2005, 17h24
  5. Boucler sur des champs texte
    Par syl2095 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 25/11/2004, 16h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo