|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Nouveau Membre du Club
![]() med benÉtudiant Inscription : octobre 2010 Messages : 74 ![]() |
Bonjour,
je cherche à afficher la liste des employés qui n'ont pas de planning entre deux dates supérieures à la date du jour employe(id_emp,nom) planning(id_pla,dateD,dateF) détail_emp_pla(id_emp,id_pla) voilà mon essai avec date début '2011-05-09' et date fin '2011-05-15' Code :
MERCI |
||
|
|
00
|
|
|
#2 | ||
![]() ![]() Alain Ingénieur d'études décisionnel Inscription : mai 2002 Messages : 4 445 ![]() |
Il suffit d'ajouter la liste des employés qui ne sont pas dans le planning, avec une union :
Code :
__________________
Modérateur Langage SQL N'oubliez pas le bouton et pensez aux balises [code]Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur ![]() |
||
|
|
20
|
|
|
#3 |
|
Nouveau Membre du Club
![]() med benÉtudiant Inscription : octobre 2010 Messages : 74 ![]() |
Merci pour votre réponse mais cette fois c'est l'inverse j'obtiens ceux qui ne sont pas encore inscrit dans un planning sans ceux qui sont inscrit dans d'autres planning mais ils sont libre entre les deux dates .
|
|
|
00
|
|
|
#4 |
|
Membre Expert
![]() Pacman PacmanBusiness analyst Inscription : juin 2004 Messages : 1 417 ![]() |
Salut !
C'est un peu étrange, mais il y a quelques remarques qu'on peut faire : - Normalement, Al1 ayant ajouté un UNION ALL, il ne pourrait y avoir que des lignes en plus, pas en moins - Cela dit, il a remplacé ton filtre par OVERLAPS, et ce n'est pas exactement la même chose. Par exemple : La période '2011-05-08', '2011-05-09' n'overlaps pas la période '2011-05-09', '2011-05-15', donc elle passe le filtre d'al1 Par contre, elle '2011-05-09' est BETWEEN '2011-05-09' AND '2011-05-15' : elle passe pas ton filtre ! (A noter que par rapport à ta problématique, la logique OVERLAPS semble plus adaptée. A noter également que j'ai fait le test sous Oracle, en espérant que le comportement est le même) - Un point d'attention supplémentaire : je pense que la requête de base (même OVERLAPS), risque de te retourner des résultats pas toujours justes. En effet, si tu as deux lignes de planning dans le futur pour un gars, une qui overlaps, l'autre qui n'overlaps pas, le gars va sortir dans le résultat, ce que tu ne veux pas... => Il te faudrait par exemple un truc à base de NOT EXISTS je pense... ++
__________________
(c'est ma photo) Paku, Paku ! Pour les jeunes incultes : non, je ne suis pas un pokémon... Le pacblog : http://pacmann.over-blog.com/ |
|
00
|
|
|
#5 | ||
|
Invité de passage
![]() Consultant en Business Intelligence Inscription : mai 2011 Messages : 5 ![]() |
Bonjour,
Pour répondre à ton besoin, j'ai modifié légèrement ta requête : Code :
Je te répondrai rapidmeent. |
||
|
|
00
|
|
|
#6 | ||
|
Nouveau Membre du Club
![]() med benÉtudiant Inscription : octobre 2010 Messages : 74 ![]() |
bonjour j'ai trouvé cette solution
Code sql :
les employés ayant un planning entre ces deux dates ('2011-05-08' AND '2011-05-16')d1 ne doivent pas figurer libre entre ( '2011-05-09' AND '2011-05-15')d2 par ce que d1 est inclue dans d2 |
||
|
|
00
|
|
|
#7 | ||
![]() ![]() |
Dans le principe, il faut chercher d'abord quels plannings sont en intersection avec la période donnée puis quels sont les employés n'étant pas associés à un de ces plannings.
Tu n'as pas précisé quel est ton SGBD. S'il supporte la fonction OVERLAPS, tu peux faire la requête suivante : Code :
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française ! Linuxiens, comptez-vous ! |
||
|
10
|
|
|
#8 | ||
|
Nouveau Membre du Club
![]() med benÉtudiant Inscription : octobre 2010 Messages : 74 ![]() |
merci pour votre réponse le SGBD c'est MYSQL il ne support pas la fonction OVERLAPS :s
j'ai mis ça à la place de overlaps Code sql :
(2011-05-13 and 2011-05-19) |
||
|
|
00
|
|
|
#9 | ||
|
Nouveau Membre du Club
![]() med benÉtudiant Inscription : octobre 2010 Messages : 74 ![]() |
j'ai trouvé la solution merci à tout le monde pour votre aide
Code sql :
|
||
|
|
00
|
|
|
#10 | ||
![]() ![]() |
Soit deux périodes A et B définies par leurs dates de début DA et DB et leurs dates de fin FA et FB.
Pour que B soit en intersection avec A, il faut que : - DB soit entre DA et FA - ou que FB soit entre DA et FA - ou que DB soit inférieur à DA et que FB soit supérieur à FA Ma requête précédente avec OVERLAPS deviendrait donc celle ci : Code :
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française ! Linuxiens, comptez-vous ! |
||
|
00
|
|
|
#11 | ||
|
Membre Expert
![]() Pacman PacmanBusiness analyst Inscription : juin 2004 Messages : 1 417 ![]() |
Toute petite remarque Phil :
Est-ce que ['2011-05-08', '2011-05-09'] marche ? Pour ma part je dirais que, si on suppose que Fx > Dx, il faut que les bornes soient ouvertes. Code :
__________________
(c'est ma photo) Paku, Paku ! Pour les jeunes incultes : non, je ne suis pas un pokémon... Le pacblog : http://pacmann.over-blog.com/ |
||
|
00
|
|
|
#12 |
![]() ![]() |
BETWEEN inclut les bornes. C'est pour ça que dans la dernière condition, j'ai mis strictement supérieur et inférieur.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française ! Linuxiens, comptez-vous ! |
|
00
|
|
|
#13 |
|
Membre Expert
![]() Pacman PacmanBusiness analyst Inscription : juin 2004 Messages : 1 417 ![]() |
Sans vouloir chipotter, ta dernière disjonction permet juste d'inclure les cas strictement couvrants.
Cela n'exclut pas le cas qu'il faut exclure (qui est inclus par la deuxième disjonction) : ['2011-05-08', '2011-05-09']
__________________
(c'est ma photo) Paku, Paku ! Pour les jeunes incultes : non, je ne suis pas un pokémon... Le pacblog : http://pacmann.over-blog.com/ |
|
00
|
|
|
#14 | |
![]() ![]() |
Citation:
![]() Ma sous-requête cherche les plannings qui ont un point commun avec la période de référence du 9 au 15 mai inclus. Et comme la requête principale cherche les personnes qui n'ont pas de plannings dans la sous-requête, j'ai bien les personnes qui n'ont pas de plannings dans la période de référence. Non ?
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française ! Linuxiens, comptez-vous ! |
|
|
00
|
|
|
#15 |
|
Membre Expert
![]() Pacman PacmanBusiness analyst Inscription : juin 2004 Messages : 1 417 ![]() |
Je pense que quelque part, ça doit coincer.
Dans mon planning, j'ai : ['2011-05-08', '2011-05-09'] Suis-je libre entre le ['2011-05-09', '2011-05-15'] ? - Si oui, la requête ne retourne pas le bon résultat (car '2011-05-09' est BETWEEN '2011-05-09' AND '2011-05-15') between - Si non, ça veut dire que la date fin de mon planning serait '2011-05-09:23h59' et la date début de ma borne de recherche '2011-05-09:00h00' Mais dans ce cas, on peut prendre un deuxième cas : Dans mon planning j'ai : ['2011-05-15', '2011-05-16'] Même question : Suis-je libre entre le ['2011-05-09', '2011-05-15'] ? - Si oui, la requête retourne le mauvais résultat (car '2011-05-15' est BETWEEN '2011-05-09' AND '2011-05-15') - Si non, ça veut dire que la date début de mon planning serait '2011-05-15:23h59' et la date fin de ma borne de recherche '2011-05-15:00h00' => Il y a au minimum un problème d'uniformité non ?
__________________
(c'est ma photo) Paku, Paku ! Pour les jeunes incultes : non, je ne suis pas un pokémon... Le pacblog : http://pacmann.over-blog.com/ |
|
00
|
|
|
#16 | |||
![]() ![]() |
Citation:
Citation:
"Ai-je un jour de libre du 9 au 15 mai ?" Car d'après la définition des tables données par Med_be : Citation:
Ou alors le besoin a été mal exprimé... ?
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française ! Linuxiens, comptez-vous ! |
|||
|
01
|
|
|
#17 |
|
Membre Expert
![]() Pacman PacmanBusiness analyst Inscription : juin 2004 Messages : 1 417 ![]() |
J'ai dit "Suis-je libre entre ..." c'est :
- extrêmement différent de ce que tu me fais dire : "Ai-je un jour de libre" (Du "il existe" contre du "quelque soit", c'est bien différent, non est bien d'accord ?) - c'est très proche (non ?) de "n'ai-je aucun planning entre" Et pour le reste, j'abandonne...
__________________
(c'est ma photo) Paku, Paku ! Pour les jeunes incultes : non, je ne suis pas un pokémon... Le pacblog : http://pacmann.over-blog.com/ |
|
00
|
Copyright © 2000-2012 - www.developpez.com