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

Langage SQL Discussion :

condition de sélection sur période de dates


Sujet :

Langage SQL

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    246
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2002
    Messages : 246
    Points : 321
    Points
    321
    Par défaut condition de sélection sur période de dates
    Bonjour,

    J'ai un petit problème pour définir correctement une condition sur une période de dates en SQL.

    Voila la base, j'ai une table de "personnes" et une table "agenda". La table agenda contient des champs "DébutAbsence" et "FinAbsence"
    Le champ FinAbsence peut être vide ce qui veut dire qu'on ne sait pas combien de temps la personne va rester absente.

    Le problème c'est que je n'arrive pas a sélectionner uniquement les personnes présentes.
    Dans ma sélection j'ai donc besoin des personnes qui n'ont rien dans l'agenda (pas de lien personne-agenda) et des personnes qui ne sont pas dans la période d'absence de leur agenda.

    Quelle est la bonne syntaxe ???

    J'ai une requete du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Select * from personnes
    left join agenda on personnes.id = agenda.id_personne
    where ...... la je suis perdu
    Je n'arrive pas a bien trouver la condition pour prendre les personnes actuellement présentes. Les différents cas que j'ai essayé ne fonctionnenent pas car s'il y a une absence précédente (et donc terminée)
    la requete n'affiche pas cette personne alors qu'elle devrait l'être. (ex: un absent du 01/06/2010 au 06/06/2010) n'est pas repris alors qu'il devrait l'être.

    Pour résumer:

    à la date du 08/07/2010 la requete devrait traiter les cas suivants comme ceci.

    * Une personne sans ligne agenda ==> afficher
    * Une personne avec agenda debut: 01/06/2010 et fin 06/06/2010 ==> afficher
    * Une personne avec agenda debut: 01/06/2010 et fin est vide ==> ne pas afficher
    * Une personne avec agenda debut: 01/08/2010 et fin est vide ==> afficher
    * Une personne avec agenda debut: 15/07/2010 et fin 21/07/2010 ==> afficher
    * Une personne avec agenda debut: 05/07/2010 et fin 12/07/2010 ==> ne pas afficher

    Je n'arrive pas a trouver la bonne condition....

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    Bonjour,
    Une piste au lieu d'une jointure externe utilise un not exists.
    La personne est présente un jour donné si elle n'a pas d'absence ce jour là.
    Cordialement
    Soazig

  3. #3
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    à la date du 08/07/2010 la requete devrait traiter les cas suivants comme ceci.

    * Une personne sans ligne agenda ==> afficher
    * Une personne avec agenda debut: 01/06/2010 et fin 06/06/2010 ==> afficher
    * Une personne avec agenda debut: 01/06/2010 et fin est vide ==> ne pas afficher
    * Une personne avec agenda debut: 01/08/2010 et fin est vide ==> afficher
    * Une personne avec agenda debut: 15/07/2010 et fin 21/07/2010 ==> afficher
    * Une personne avec agenda debut: 05/07/2010 et fin 12/07/2010 ==> ne pas afficher
    Autrement dit, on affiche les personnes qui n'ont pas d'agenda ou dont l'agenda a une date de fin dans le passé ou une date de début dans le futur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT p.les_colonnes
    FROM personnes AS p
    LEFT JOIN agenda AS a ON p.id = a.id_personne
    WHERE a.id_personne IS NULL
        OR a.FinAbsence < CURRENT_DATE
        OR a.DebutAbsence > CURRETN_DATE
    Note : Évite le SELECT * et les noms de colonnes avec des accents.

Discussions similaires

  1. [AC-2007] sélection date sur période
    Par hugodu28 dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 17/11/2010, 11h36
  2. [XI R2] Condition sur des objets "date-heure"
    Par bastoonet dans le forum Deski
    Réponses: 2
    Dernier message: 09/09/2008, 17h21
  3. [CR 9] Sélection sur plage de date
    Par zycomatic dans le forum SAP Crystal Reports
    Réponses: 4
    Dernier message: 12/06/2008, 09h48
  4. Sélection sur DATE unique
    Par nerick dans le forum Langage SQL
    Réponses: 3
    Dernier message: 03/01/2006, 15h28
  5. [CR] Problème de sélection sur un champ date
    Par noluc dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 21/11/2003, 16h56

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