Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 28/06/2011, 07h58   #1
Invité régulier
 
Étudiant
Inscription : octobre 2007
Messages : 21
Détails du profil
Informations personnelles :
Âge : 26
Localisation : Madagascar

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : octobre 2007
Messages : 21
Points : 5
Points : 5
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 :
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 ?
navalina est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/06/2011, 08h04   #2
Modérateur
 
Avatar de Bisûnûrs
 
Josselin
Développeur Web
Inscription : janvier 2004
Messages : 9 050
Détails du profil
Informations personnelles :
Nom : Josselin
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : janvier 2004
Messages : 9 050
Points : 12 181
Points : 12 181
Tes sous-requêtes doivent être entourées de parenthèses et non de quotes. Là elles sont juste traitées comme des chaines ..
Bisûnûrs est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/06/2011, 08h31   #3
Invité régulier
 
Étudiant
Inscription : octobre 2007
Messages : 21
Détails du profil
Informations personnelles :
Âge : 26
Localisation : Madagascar

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : octobre 2007
Messages : 21
Points : 5
Points : 5
Par défaut nouvelle requete

Et j'ai fait la modification comme ceci:
Code :
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:
Citation:
#1241 - Operand should contain 1 column(s)
navalina est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/06/2011, 09h12   #4
Modérateur
 
Avatar de Bisûnûrs
 
Josselin
Développeur Web
Inscription : janvier 2004
Messages : 9 050
Détails du profil
Informations personnelles :
Nom : Josselin
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : janvier 2004
Messages : 9 050
Points : 12 181
Points : 12 181
C'est normal, tes sous-requêtes ne doivent renvoyer qu'une seule colonne (champ dans ton SELECT) de type DATE.
Bisûnûrs est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/06/2011, 09h15   #5
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 437
Points : 6 437
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
Mes tutoriels et la FAQ MySQL

----------------------------------------------------
Pensez aux balises code et au tag
Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
ced est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/06/2011, 09h55   #6
Invité régulier
 
Étudiant
Inscription : octobre 2007
Messages : 21
Détails du profil
Informations personnelles :
Âge : 26
Localisation : Madagascar

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : octobre 2007
Messages : 21
Points : 5
Points : 5
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".
navalina est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/06/2011, 10h31   #7
Modérateur
 
Avatar de Bisûnûrs
 
Josselin
Développeur Web
Inscription : janvier 2004
Messages : 9 050
Détails du profil
Informations personnelles :
Nom : Josselin
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : janvier 2004
Messages : 9 050
Points : 12 181
Points : 12 181
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.
Bisûnûrs est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/06/2011, 10h44   #8
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 437
Points : 6 437
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 :
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
Mes tutoriels et la FAQ MySQL

----------------------------------------------------
Pensez aux balises code et au tag
Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
ced est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/06/2011, 11h06   #9
Invité régulier
 
Étudiant
Inscription : octobre 2007
Messages : 21
Détails du profil
Informations personnelles :
Âge : 26
Localisation : Madagascar

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : octobre 2007
Messages : 21
Points : 5
Points : 5
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
navalina est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/06/2011, 11h08   #10
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 437
Points : 6 437
On peut avoir un jeu de données ?
__________________
Rédacteur / Modérateur SGBD
Mes tutoriels et la FAQ MySQL

----------------------------------------------------
Pensez aux balises code et au tag
Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
ced est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/06/2011, 11h28   #11
Invité régulier
 
Étudiant
Inscription : octobre 2007
Messages : 21
Détails du profil
Informations personnelles :
Âge : 26
Localisation : Madagascar

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : octobre 2007
Messages : 21
Points : 5
Points : 5
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
navalina est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/06/2011, 11h38   #12
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 437
Points : 6 437
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
Mes tutoriels et la FAQ MySQL

----------------------------------------------------
Pensez aux balises code et au tag
Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
ced est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/06/2011, 12h20   #13
Invité régulier
 
Étudiant
Inscription : octobre 2007
Messages : 21
Détails du profil
Informations personnelles :
Âge : 26
Localisation : Madagascar

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : octobre 2007
Messages : 21
Points : 5
Points : 5
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
navalina est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/06/2011, 13h31   #14
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 437
Points : 6 437
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 :
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
Mes tutoriels et la FAQ MySQL

----------------------------------------------------
Pensez aux balises code et au tag
Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
ced est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 28/06/2011, 13h40   #15
Invité régulier
 
Étudiant
Inscription : octobre 2007
Messages : 21
Détails du profil
Informations personnelles :
Âge : 26
Localisation : Madagascar

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : octobre 2007
Messages : 21
Points : 5
Points : 5
Merci ça marche
navalina est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/07/2011, 15h34   #16
Invité régulier
 
Étudiant
Inscription : octobre 2007
Messages : 21
Détails du profil
Informations personnelles :
Âge : 26
Localisation : Madagascar

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : octobre 2007
Messages : 21
Points : 5
Points : 5
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?
navalina est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/07/2011, 15h59   #17
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 437
Points : 6 437
Essaie avec la fonction TIME_TO_SEC(time), en divisant par 60 pour passer de secondes en minutes :
Code :
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
Mes tutoriels et la FAQ MySQL

----------------------------------------------------
Pensez aux balises code et au tag
Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
ced est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 14/07/2011, 11h22   #18
Invité régulier
 
Étudiant
Inscription : octobre 2007
Messages : 21
Détails du profil
Informations personnelles :
Âge : 26
Localisation : Madagascar

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : octobre 2007
Messages : 21
Points : 5
Points : 5
Il marche bien merci
navalina est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h07.


 
 
 
 
Partenaires

Hébergement Web