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 MySQL Discussion :

requête datediff en Mysql


Sujet :

Requêtes MySQL

  1. #1
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 24
    Points : 16
    Points
    16
    Par défaut requête datediff en Mysql
    Bonjour à tous, j'ai un problème comme cela, le résultat de ma requête affiche toujours null:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT Immatricule, dateExacte, DATEDIFF( 
        'SELECT Immatricule, DatePointage, TypePointage 
        FROM pointage 
        WHERE TypePointage=SORTIE', 
        'SELECT Immatricule, DatePointage, TypePointage 
        FROM pointage WHERE TypePointage=ENTREE' 
    ) AS duree
    FROM pointage 
    ORDER BY DateExacte
    Pouvez-vous m'aider à identifier l'erreur ?

  2. #2
    Modérateur
    Avatar de Bisûnûrs
    Profil pro
    Développeur Web
    Inscrit en
    Janvier 2004
    Messages
    9 868
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2004
    Messages : 9 868
    Points : 16 258
    Points
    16 258
    Par défaut
    Tes sous-requêtes doivent être entourées de parenthèses et non de quotes. Là elles sont juste traitées comme des chaines ..

  3. #3
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 24
    Points : 16
    Points
    16
    Par défaut nouvelle requete
    Et j'ai fait la modification comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT Immatricule, dateExacte, DATEDIFF(
        (SELECT Immatricule, DatePointage, TypePointage 
         FROM pointage WHERE TypePointage='SORTIE'), 
        (SELECT Immatricule, DatePointage, TypePointage 
         FROM pointage WHERE TypePointage='ENTREE')
    ) AS duree
    FROM pointage 
    ORDER BY DateExacte
    et il y a cette erreur:
    #1241 - Operand should contain 1 column(s)

  4. #4
    Modérateur
    Avatar de Bisûnûrs
    Profil pro
    Développeur Web
    Inscrit en
    Janvier 2004
    Messages
    9 868
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2004
    Messages : 9 868
    Points : 16 258
    Points
    16 258
    Par défaut
    C'est normal, tes sous-requêtes ne doivent renvoyer qu'une seule colonne (champ dans ton SELECT) de type DATE.

  5. #5
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 707
    Points
    23 707
    Par défaut
    Bonjour,

    Et si tu nous donnais le schéma de ta table, un petit exemple de son contenu et ce que tu souhaites faire ?
    Ça serait plus facile pour t'aider...
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  6. #6
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 24
    Points : 16
    Points
    16
    Par défaut
    Voici la structure de la table:
    pointage
    Colonne			Type			Null	Défaut
    DatePointage		timestamp		Non	CURRENT_TIMESTAMP  	 
    TypePointage		varchar(200)		Non
    Immatricule		int(4)			Non
    DateExacte		varchar(10)		Non
    ID_Pointage		bigint(20)		Non
    up			int(2)			Non
    duree			int(11)			Non
    et dans la datepointage se trouvent toutes les dates, heures, minutes de pointage d'une personne. Mais pour pouvoir le calculer, il faut la différencier par le typepointage, qui ont pour valeur "entree" et "sortie".

  7. #7
    Modérateur
    Avatar de Bisûnûrs
    Profil pro
    Développeur Web
    Inscrit en
    Janvier 2004
    Messages
    9 868
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2004
    Messages : 9 868
    Points : 16 258
    Points
    16 258
    Par défaut
    Citation Envoyé par Bisûnûrs Voir le message
    C'est normal, tes sous-requêtes ne doivent renvoyer qu'une seule colonne (champ dans ton SELECT) de type DATE.

  8. #8
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 707
    Points
    23 707
    Par défaut
    Il faut passer par des jointures, pour n'avoir qu'une seule date d'entrée et de sortie par ligne dans la fonction DATEDIFF.
    Essaie la requête suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT e.Immatricule, e.dateExacte, DATEDIFF(s.datePointage, e.datePointage) AS duree
    FROM pointage e
    INNER JOIN pointage s ON e.Immatricule = s.Immatricule AND s.typePointage = 'SORTIE'
    WHERE e.typePointage = 'ENTREE'
    ORDER BY e.dateExacte
    L'idée, c'est de faire une jointure entre les entrées (pointage avec l'alias e) et les sorties (pointage avec l'alias s) d'un même immatricule.
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  9. #9
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 24
    Points : 16
    Points
    16
    Par défaut
    Cette dernière donne un résultat mais ne correspond pas à des valeurs correctes.
    Il fait boucler un matricule et affiche des résultats: -18 à 18 et n'affiche pas toutes les dates dans la table

  10. #10
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 707
    Points
    23 707
    Par défaut
    On peut avoir un jeu de données ?
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  11. #11
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 24
    Points : 16
    Points
    16
    Par défaut
    voici un exemple de résultat de la requête:
    Lignes: 30
    Immatricule dateExacte duree
    1081 01/04/2011 20
    1081 01/04/2011 18
    1081 01/04/2011 17
    1081 01/04/2011 16
    1081 01/04/2011 15
    1081 01/04/2011 14
    1081 01/04/2011 13
    1081 01/04/2011 11
    1081 01/04/2011 10
    1081 01/04/2011 9
    1081 01/04/2011 8
    1081 01/04/2011 7
    1081 01/04/2011 6
    1081 01/04/2011 4
    1081 01/04/2011 3
    1081 01/04/2011 2
    1081 01/04/2011 1
    1081 01/04/2011 0
    1081 01/04/2011 -14
    1081 01/04/2011 -15
    1081 01/04/2011 -17
    1081 01/04/2011 -18
    1081 01/04/2011 974
    1081 01/04/2011 -20
    1081 01/04/2011 -21
    1081 01/04/2011 -22
    1081 01/04/2011 -25
    1081 01/04/2011 -26
    1081 01/04/2011 -27
    1081 01/04/2011 -28
    Il fait un boucle sur chaque matricule et je ne comprend ce qu'il affiche non plus

  12. #12
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 707
    Points
    23 707
    Par défaut
    En fait, ce qu'il nous faut, c'est le contenu de la table (ou un extrait) et le résultat que tu attends en sortie de requête.
    Là, le problème vient certainement du fait que la jointure sur l'immatricule n'est pas suffisante pour distinguer l'entrée et la sortie qui lui correspond. Mais ça, on ne peut pas le deviner.

    Comment on sait à quelle entrée correspond une sortie (ou l'inverse) ?
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  13. #13
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 24
    Points : 16
    Points
    16
    Par défaut
    voici un extrait de la table:
    DatePointage TypePointage Immatricule DateExacte ID_Pointage up duree
    2011-05-05 06:42:05 ENTREE 16 05/05/2011 79322 0 0
    2011-05-05 06:42:06 ENTREE 898 05/05/2011 79323 0 0
    2011-05-05 06:42:07 ENTREE 1081 05/05/2011 79324 0 0
    2011-05-05 06:42:08 ENTREE 1352 05/05/2011 79325 0 0
    2011-05-05 15:36:04 SORTIE 898 05/05/2011 79675 0 0
    2011-05-05 15:36:14 SORTIE 1081 05/05/2011 79683 0 0
    2011-05-05 17:30:12 SORTIE 16 05/05/2011 79789 0 0
    2011-05-05 17:33:30 SORTIE 1352 05/05/2011 79889 0 0
    et je veux faire la différence entre entree et sortie
    merci d'avance

  14. #14
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 707
    Points
    23 707
    Par défaut
    Avec le jeu de données que tu fournis, j'obtiens bien un résultat cohérent, mais il est préférable de remplacer DATEDIFF par la fonction TIMEDIFF.
    Cela dit, quand je regarde le résultat que tu donnes, je pense que la jointure entre entrée et sortie est incomplète, et qu'il faut ajouter dans la condition la date exacte.
    Essaie comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT e.Immatricule, e.dateExacte, TIMEDIFF(s.datePointage, e.datePointage) AS duree
    FROM pointage e
    INNER JOIN pointage s ON e.Immatricule = s.Immatricule AND e.dateExacte = s.dateExacte AND s.typePointage = 'SORTIE'
    WHERE e.typePointage = 'ENTREE'
    ORDER BY e.dateExacte
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  15. #15
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 24
    Points : 16
    Points
    16
    Par défaut
    Merci ça marche

  16. #16
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 24
    Points : 16
    Points
    16
    Par défaut
    en fait, je veux qu'il apparaissent en minute mais pas en heure!
    est ce qu'il y a un code qui fait cette conversion?

  17. #17
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 707
    Points
    23 707
    Par défaut
    Essaie avec la fonction TIME_TO_SEC(time), en divisant par 60 pour passer de secondes en minutes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT e.Immatricule, e.dateExacte, TIME_TO_SEC(TIMEDIFF(s.datePointage, e.datePointage)) / 60 AS duree
    FROM pointage e
    INNER JOIN pointage s ON e.Immatricule = s.Immatricule AND e.dateExacte = s.dateExacte AND s.typePointage = 'SORTIE'
    WHERE e.typePointage = 'ENTREE'
    ORDER BY e.dateExacte
    Sinon, jette un oeil dans les différentes fonctions de date et heure dans la documentation MySQL, histoire de voir si tu n'y trouverais pas ton bonheur : http://dev.mysql.com/doc/refman/5.0/...functions.html
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  18. #18
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 24
    Points : 16
    Points
    16
    Par défaut
    Il marche bien merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Convertir une requête Acces en MySQL
    Par Creepy78 dans le forum Langage SQL
    Réponses: 10
    Dernier message: 28/02/2006, 16h24
  2. Requête hyerarchique avec MySQL
    Par ingamo dans le forum Requêtes
    Réponses: 3
    Dernier message: 09/02/2006, 21h39
  3. Requête sur DB mysql
    Par Lord_FEFF dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 09/11/2005, 19h16
  4. Equivalent a fonction DATEDIFF pour MySQL version 3.23
    Par npze dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 31/10/2005, 11h18
  5. Convertir une requête Access en MySQL
    Par iomega dans le forum Langage SQL
    Réponses: 5
    Dernier message: 06/03/2004, 09h47

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