Requête SQL sélection de date
Résolu/Fermé
guewen56
guewen56
- Messages postés
- 34
- Date d'inscription
- jeudi 29 novembre 2018
- Statut
- Membre
- Dernière intervention
- 2 janvier 2021
guewen56
- Messages postés
- 34
- Date d'inscription
- jeudi 29 novembre 2018
- Statut
- Membre
- Dernière intervention
- 2 janvier 2021
A voir également:
- Requête sql date supérieure à
- Sql date la plus récente - Meilleures réponses
- Sql date supérieur - Meilleures réponses
- [SQL] manipulation des dates ✓ - Forum - Programmation
- Requête SQL sélection de date ✓ - Forum - MySQL
- Requete critere date année ✓ - Forum - Access
- Requête SQL avec filtre d'une seule Date ✓ - Forum - Access
- SQL WHERE DATE = YESTERDAY ✓ - Forum - MySQL
4 réponses
jordane45
29 nov. 2018 à 17:53
- Messages postés
- 35448
- Date d'inscription
- mercredi 22 octobre 2003
- Statut
- Modérateur
- Dernière intervention
- 20 mai 2022
29 nov. 2018 à 17:53
Bonjour,
Regarde donc :
Regarde donc :
WHERE datevisite < date_sub(now(), interval 8 month)
yg_be
Modifié le 1 déc. 2018 à 12:29
- Messages postés
- 19277
- Date d'inscription
- lundi 9 juin 2008
- Statut
- Contributeur
- Dernière intervention
- 19 mai 2022
Modifié le 1 déc. 2018 à 12:29
bonjour, peut-être simplement:
Tu souhaites bien récupérer la liste des médecins dont la dernière visite date de plus de 8 mois, avec, pour chaque médecin, la date de la dernière visite?
Ce que tu avais programmé: récupérer la liste des médecins visités il y a plus de 8 mois, avec, pour chaque médecin, la dernière visite datant d'il y a plus de 8 mois.
Je pense que ta description était un peu confuse.
select medecin.codemed, max(visite.DATEVISITE) from medecin left join visite on medecin.codemed = visite.codemed group by codemed having (timestampdiff(MONTH, max(visite.DATEVISITE), curdate()) > 8 ) ;
Tu souhaites bien récupérer la liste des médecins dont la dernière visite date de plus de 8 mois, avec, pour chaque médecin, la date de la dernière visite?
Ce que tu avais programmé: récupérer la liste des médecins visités il y a plus de 8 mois, avec, pour chaque médecin, la dernière visite datant d'il y a plus de 8 mois.
Je pense que ta description était un peu confuse.
guewen56
Modifié le 1 déc. 2018 à 14:52
- Messages postés
- 34
- Date d'inscription
- jeudi 29 novembre 2018
- Statut
- Membre
- Dernière intervention
- 2 janvier 2021
Modifié le 1 déc. 2018 à 14:52
Bonjour, je te remercie pour ta réponse yg_be,
Merci à toi pour ta proposition de requête qui à fonctionné et je t'en suis reconnaissant.
J'ai pas forcément bien expliqué le problème et ce que tu as analysé dans ta description est correct.
Seulement il manque un petit détail, j'ai essayé de ajouter les médecin dans cette même liste qui n'ont encore jamais eu de visite en prenant les codemed n'ayant pas de dates, mais cela n'a pas fonctionné.
Pouvez vous m'aidez?
Merci d'avance pour vos réponses.
Merci à toi pour ta proposition de requête qui à fonctionné et je t'en suis reconnaissant.
J'ai pas forcément bien expliqué le problème et ce que tu as analysé dans ta description est correct.
Seulement il manque un petit détail, j'ai essayé de ajouter les médecin dans cette même liste qui n'ont encore jamais eu de visite en prenant les codemed n'ayant pas de dates, mais cela n'a pas fonctionné.
Pouvez vous m'aidez?
Merci d'avance pour vos réponses.
yg_be
1 déc. 2018 à 15:09
- Messages postés
- 19277
- Date d'inscription
- lundi 9 juin 2008
- Statut
- Contributeur
- Dernière intervention
- 19 mai 2022
- Messages postés
- 34
- Date d'inscription
- jeudi 29 novembre 2018
- Statut
- Membre
- Dernière intervention
- 2 janvier 2021
1 déc. 2018 à 15:09
peut-être:
select medecin.codemed, max(ifnull(visite.DATEVISITE,0) from medecin left join visite on medecin.codemed = visite.codemed group by codemed having (timestampdiff(MONTH, max(visite.DATEVISITE), curdate()) > 8 ) ;
guewen56
1 déc. 2018 à 15:23
- Messages postés
- 34
- Date d'inscription
- jeudi 29 novembre 2018
- Statut
- Membre
- Dernière intervention
- 2 janvier 2021
1 déc. 2018 à 15:23
yg_be
Modifié le 1 déc. 2018 à 15:31
- Messages postés
- 19277
- Date d'inscription
- lundi 9 juin 2008
- Statut
- Contributeur
- Dernière intervention
- 19 mai 2022
- Messages postés
- 34
- Date d'inscription
- jeudi 29 novembre 2018
- Statut
- Membre
- Dernière intervention
- 2 janvier 2021
Modifié le 1 déc. 2018 à 15:31
et ainsi, cela donne quoi?
si c'est pas bon, montre ce que cela donne sans la ligne avec having.
select medecin.codemed, max(ifnull(visite.DATEVISITE,0) from medecin left join visite on medecin.codemed = visite.codemed group by codemed having (timestampdiff(MONTH, max(ifnull(visite.DATEVISITE,0), curdate()) > 8 ) ;
si c'est pas bon, montre ce que cela donne sans la ligne avec having.
guewen56
Modifié le 1 déc. 2018 à 15:47
- Messages postés
- 34
- Date d'inscription
- jeudi 29 novembre 2018
- Statut
- Membre
- Dernière intervention
- 2 janvier 2021
Modifié le 1 déc. 2018 à 15:47
Bonjour,
Merci pour ta réponse,
avec Having :
Une erreur est apparue, il manquais 1 à 2 parenthèses mais cela n'a pas résolu complétement le problème :

Ensuite sans le Having :
cela revient au problème principal avec le m001 qui réapparait mais les valeurs null apparaissent :

ps : j'ai changé la valeur de
à
Merci d'avance pour vos réponses.
Merci pour ta réponse,
avec Having :
Une erreur est apparue, il manquais 1 à 2 parenthèses mais cela n'a pas résolu complétement le problème :
Ensuite sans le Having :
cela revient au problème principal avec le m001 qui réapparait mais les valeurs null apparaissent :
ps : j'ai changé la valeur de
max(ifnull(visite.DATEVISITE,0))
à
max(ifnull(visite.DATEVISITE,null))
Merci d'avance pour vos réponses.
guewen56
29 nov. 2018 à 21:03
- Messages postés
- 34
- Date d'inscription
- jeudi 29 novembre 2018
- Statut
- Membre
- Dernière intervention
- 2 janvier 2021
29 nov. 2018 à 21:03
jordane45
29 nov. 2018 à 22:36
- Messages postés
- 35448
- Date d'inscription
- mercredi 22 octobre 2003
- Statut
- Modérateur
- Dernière intervention
- 20 mai 2022
29 nov. 2018 à 22:36
Et via un sous select ?
SELECT T.codemed, max(T.DATEVISITE) as DATE_MAX_VISITE FROM ( SELECT M.codemed ,V.DATEVISITE FROM medecin M LEFT JOIN visite V ON M.codemed = V.codemed WHERE V.datevisite < date_sub(now(), interval 8 month) OR ISNULL(V.datevisite) )T GROUP BY T.codemed
guewen56
Modifié le 29 nov. 2018 à 23:15
- Messages postés
- 34
- Date d'inscription
- jeudi 29 novembre 2018
- Statut
- Membre
- Dernière intervention
- 2 janvier 2021
Modifié le 29 nov. 2018 à 23:15
bonjour,
Merci pour ta réponse Jordane45.
La requête à fonctionné, mais le résultat attendu n'a pas fonctionné.
J'ai fait les mêmes tests, le problème persiste. Le m001 devrais disparaitre car la date la plus récente date de moins de 8 mois donc m001 ne devrais pas s'afficher, mais il va quand même chercher la date la plus récente de + de 8 mois.
Voir ci dessous :

Merci d'avance pour vos réponses.
Merci pour ta réponse Jordane45.
La requête à fonctionné, mais le résultat attendu n'a pas fonctionné.
J'ai fait les mêmes tests, le problème persiste. Le m001 devrais disparaitre car la date la plus récente date de moins de 8 mois donc m001 ne devrais pas s'afficher, mais il va quand même chercher la date la plus récente de + de 8 mois.
Voir ci dessous :
Merci d'avance pour vos réponses.
jordane45
29 nov. 2018 à 23:31
- Messages postés
- 35448
- Date d'inscription
- mercredi 22 octobre 2003
- Statut
- Modérateur
- Dernière intervention
- 20 mai 2022
29 nov. 2018 à 23:31
Ah mais... tu veux les dates de plus de 8 mois ?..dans ce cas suffit de changer le sens de la comparaison...
WHERE V.datevisite > date_sub(now(), interval 8 month) OR ISNULL(V.datevisite)
jordane45
29 nov. 2018 à 23:32
- Messages postés
- 35448
- Date d'inscription
- mercredi 22 octobre 2003
- Statut
- Modérateur
- Dernière intervention
- 20 mai 2022
29 nov. 2018 à 23:32
Pu alors c'est le max date qui doit etre de plus dr 8 mois ?
Dans ce cas ca il faut placer le max dans le sous select et sortir le where
Mais sans savoir exactement ce que tu veux... difficile de t'en dire plus
Dans ce cas ca il faut placer le max dans le sous select et sortir le where
Mais sans savoir exactement ce que tu veux... difficile de t'en dire plus
guewen56
Modifié le 30 nov. 2018 à 09:03
- Messages postés
- 34
- Date d'inscription
- jeudi 29 novembre 2018
- Statut
- Membre
- Dernière intervention
- 2 janvier 2021
Modifié le 30 nov. 2018 à 09:03
bonjour,
Merci encore une fois Jordane45 pour ta réponse,
Je me suis pas forcément très bien exprimé sur le sujet, commençons par le commencement :
- la date de visite correspond à la dernière visite d'un médecin :
- codemed correspond à un code médecin
- si un médecin n'a pas eu de visite depuis + de 8 mois il faut récupérer le codemed et la dernière date la + récente.
- si un médecin à eu une visite dans les 8 mois dernier il ne faut pas le récupérer.
Le but final est de récupérer l'ensemble des dates et codemed pour faire une liste qui permet de voir ceux qui n'ont pas eu de visite ces 8 dernier mois.
Le problème qui persiste est qu'il récupère quand même une date alors qu'un des médecin à eu une visite pendant ces 8 dernier mois. Voir cas m001
Je ne sais pas si sa parait clair.
Merci d'avance pour vos réponses.
Merci encore une fois Jordane45 pour ta réponse,
Je me suis pas forcément très bien exprimé sur le sujet, commençons par le commencement :
- la date de visite correspond à la dernière visite d'un médecin :
- codemed correspond à un code médecin
- si un médecin n'a pas eu de visite depuis + de 8 mois il faut récupérer le codemed et la dernière date la + récente.
- si un médecin à eu une visite dans les 8 mois dernier il ne faut pas le récupérer.
Le but final est de récupérer l'ensemble des dates et codemed pour faire une liste qui permet de voir ceux qui n'ont pas eu de visite ces 8 dernier mois.
Le problème qui persiste est qu'il récupère quand même une date alors qu'un des médecin à eu une visite pendant ces 8 dernier mois. Voir cas m001
Je ne sais pas si sa parait clair.
Merci d'avance pour vos réponses.
jordane45
30 nov. 2018 à 09:28
- Messages postés
- 35448
- Date d'inscription
- mercredi 22 octobre 2003
- Statut
- Modérateur
- Dernière intervention
- 20 mai 2022
- Messages postés
- 34
- Date d'inscription
- jeudi 29 novembre 2018
- Statut
- Membre
- Dernière intervention
- 2 janvier 2021
30 nov. 2018 à 09:28
Donc.... si je reformule correctement....
Tu veux récupérer la liste des médecins dont le max(datetevisite) est supérieur à 8 mois....
que donne ceci :
Tu veux récupérer la liste des médecins dont le max(datetevisite) est supérieur à 8 mois....
que donne ceci :
SELECT t.codemed , t.datevisiteMax FROM medecin t INNER JOIN ( SELECT codemed ,MAX(datevisite) AS datevisiteMax FROM medecin GROUP BY codemed ) temp ON t.codemed = temp.codemed WHERE t.datevisite = temp.datevisiteMax
guewen56
30 nov. 2018 à 09:59
- Messages postés
- 34
- Date d'inscription
- jeudi 29 novembre 2018
- Statut
- Membre
- Dernière intervention
- 2 janvier 2021
30 nov. 2018 à 09:59
Bonjour,
Merci pour ta réponse Jordane45.
La requête n'a pas fonctionné.
Je veux récupérer le max(datevisite) qui est supérieur à 8 mois donc pour exemple : si on prend aujourd'hui le 30 novembre, 8 mois en arrière sa fait le 30 mars si je ne me trompe pas. Donc on prend tout ce qui est avant le 30 avril si et seulement si aucune date pour un médecin est entre le 30 mars et aujourd'hui. Chaque médecin à plusieurs date de visite mais doit retourner la dernière en date si aucune de ces dates n'est entre le 30 mars et aujourd'hui.
J'espère que c'est compréhensible :-)
Merci d'avance pour vos réponses.
Merci pour ta réponse Jordane45.
La requête n'a pas fonctionné.
Je veux récupérer le max(datevisite) qui est supérieur à 8 mois donc pour exemple : si on prend aujourd'hui le 30 novembre, 8 mois en arrière sa fait le 30 mars si je ne me trompe pas. Donc on prend tout ce qui est avant le 30 avril si et seulement si aucune date pour un médecin est entre le 30 mars et aujourd'hui. Chaque médecin à plusieurs date de visite mais doit retourner la dernière en date si aucune de ces dates n'est entre le 30 mars et aujourd'hui.
J'espère que c'est compréhensible :-)
Merci d'avance pour vos réponses.