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 :

date BETWEEN date_start AND date_end marche partiellement


Sujet :

Requêtes MySQL

  1. #1
    Membre du Club
    Homme Profil pro
    Épine dans le pieds
    Inscrit en
    Mai 2004
    Messages
    425
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Épine dans le pieds

    Informations forums :
    Inscription : Mai 2004
    Messages : 425
    Points : 55
    Points
    55
    Par défaut date BETWEEN date_start AND date_end marche partiellement
    Bonjour,

    Je cherche de l'aide sur la requête suivante qui ne fonctionne qu'à moitié, sans pour autant renvoyer d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT rec_num FROM $table 
    WHERE member_id='$member_id'
    AND ((date_start BETWEEN CAST('$date_start' AS DATE) AND CAST('$date_end' AS DATE)) 
    OR (date_end BETWEEN CAST('$date_start' AS DATE) AND CAST('$date_end' AS DATE)))

    Lorsqu'un enregistrement de ma table a effectivement une valeur date_start et date_end qui englobent le critère $date_start OU le critère $date_end, j'ai bien un retour (mysql_num_rows <> 0).

    Par contre, si un enregistrement a une valeur date_start et date_end qui englobent le critère $date_start ET le critère $date_end, la requête ne le trouve pas.

    Je ne comprends pas. J'ai testé sans la première partie de mon WHERE ("member_id='$member_id' ") et le comportement de la requête est identique.

    Px

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    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 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Qu'entendez-vous par 'englobent' ?

    Un exemple de données qui cloche nous aiderait à mieux comprendre le problème.

  3. #3
    Membre du Club
    Homme Profil pro
    Épine dans le pieds
    Inscrit en
    Mai 2004
    Messages
    425
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Épine dans le pieds

    Informations forums :
    Inscription : Mai 2004
    Messages : 425
    Points : 55
    Points
    55
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Qu'entendez-vous par 'englobent' ?

    Un exemple de données qui cloche nous aiderait à mieux comprendre le problème.
    date_start : 2009-01-01
    date_end : 2009-12-31

    si critère $date_start : 2009-06-30

    alors date_start et date_end "englobent" mon critère.

    j'ai une table duties dans laquelle je stocke des périodes de travail :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    CREATE TABLE  `database1`.`duties` (
      `rec_num` int(11) NOT NULL auto_increment,
      `member_id` int(11) default NULL,
      `date_start` datetime default NULL,
      `date_end` datetime default NULL,
      PRIMARY KEY  (`rec_num`)
    ) ENGINE=MyISAM AUTO_INCREMENT=19 DEFAULT CHARSET=utf8
    Je veux saisir une nouvelle période de travail pour un membre, mais auparavant, vérifier que les dates de cette nouvelle période ne sont pas en conflit avec une période déjà saisie dans la table (chevauchement ou "overlap").

    Je me suis renseigné sur OVERLAPS mais il semble que ce ne soit pas supporté dans Mysql à ce jour.

    Merci

    Px

  4. #4
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 644
    Points
    4 644
    Par défaut
    salut,

    il manque le $date_end pour qu'on voit si cet exemple fonctionne ou pas

  5. #5
    Membre du Club
    Homme Profil pro
    Épine dans le pieds
    Inscrit en
    Mai 2004
    Messages
    425
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Épine dans le pieds

    Informations forums :
    Inscription : Mai 2004
    Messages : 425
    Points : 55
    Points
    55
    Par défaut
    Citation Envoyé par Cybher Voir le message
    salut,

    il manque le $date_end pour qu'on voit si cet exemple fonctionne ou pas
    J'ai peur de mal m'exprimer : si on saisit une nouvelle période, il suffit que la date de début ou de fin de cette période soit "englobé" par une période existante pour qu'il y ait chevauchement.

    Bien sur, il y a d'autres cas de chevauchements que je traite à part (comme une nouvelle période qui "englobe" complètement une existante, ou inversement).

    Pex

  6. #6
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    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 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Je pense qu'il faudrait inverser les critères.
    Vous avez en BDD, pour le member_id qui vous intéresse, une période :
    - date_start = '2009-01-01'
    - date_end = '2009-12-31'

    Vous voulez par exemple lui ajouter la période :
    - $date_start = '2009-06-30'
    - $date_end = '2009-07-31'

    Vous voulez, si j'ai bien compris, savoir si la nouvelle période a des jours communs avec la période enregistrée.
    C'est le cas pour :
    1) $date_start >= date_start ET $date_start <= date_end
    OU
    2) $date_end >= date_start ET $date_end <= date_end

    Autrement dit, c'est le cas pour :
    1) $date_start BETWEEN date_start AND date_end
    OU
    2) $date_end BETWEEN date_start AND date_end

    Vous n'avez plus qu'à modifier la requête.

  7. #7
    Membre du Club
    Homme Profil pro
    Épine dans le pieds
    Inscrit en
    Mai 2004
    Messages
    425
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Épine dans le pieds

    Informations forums :
    Inscription : Mai 2004
    Messages : 425
    Points : 55
    Points
    55
    Par défaut
    Bravo et merci de m'avoir tiré de ce cul de sac intellectuel

    Votre solution fonctionne parfaitement et j'y ai donc ajouté le dernier cas, où la période ajoutée "englobe" complètement une période existante dans la table :

    $date_start <= date_start
    ET
    $date_end >= date_end

    Ce qui me donne (et qui fonctionne) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT rec_num FROM $table WHERE member_id='$member_id' AND
    ( (CAST('$date_start' AS DATE) BETWEEN date_start AND date_end) OR
    (CAST('$date_end' AS DATE) BETWEEN date_start AND date_end) OR
    (CAST('$date_start' AS DATE) <= date_start AND 
    CAST('$date_end' AS DATE) >date_end))
    Merci encore pour votre aide à tous deux.

    Px

  8. #8
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    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 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par Perplexe Voir le message
    cas, où la période ajoutée "englobe" complètement une période existante dans la table :

    $date_start <= date_start
    ET
    $date_end >= date_end

    Ce qui me donne (et qui fonctionne) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT rec_num FROM $table WHERE member_id='$member_id' AND
    ( (CAST('$date_start' AS DATE) BETWEEN date_start AND date_end) OR
    (CAST('$date_end' AS DATE) BETWEEN date_start AND date_end) OR
    (CAST('$date_start' AS DATE) <= date_start AND 
    CAST('$date_end' AS DATE) >date_end))
    En toute rigueur, ce dernier cas ajouté aux autres devrait être :
    $date_start < date_start
    ET
    $date_end > date_end
    Ceci parce que BETWEEN inclut les bornes donc le = est ici inutile car pris en compte dans les BETWEEN.
    Mais bon ça ne devrait pas changer le résultat. Juste être un petit peu plus rapide si le volume de données est gros.

  9. #9
    Membre du Club
    Homme Profil pro
    Épine dans le pieds
    Inscrit en
    Mai 2004
    Messages
    425
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Épine dans le pieds

    Informations forums :
    Inscription : Mai 2004
    Messages : 425
    Points : 55
    Points
    55
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    En toute rigueur, ce dernier cas ajouté aux autres devrait être :
    $date_start < date_start
    ET
    $date_end > date_end
    Ceci parce que BETWEEN inclut les bornes donc le = est ici inutile car pris en compte dans les BETWEEN.
    Mais bon ça ne devrait pas changer le résultat. Juste être un petit peu plus rapide si le volume de données est gros.
    Très juste, c'est modifié.

    En plus je l'avais mis sur le premier et pas sur le deuxième, ce n'était pas très propre.

    Merci encore !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT rec_num FROM $table WHERE member_id='$member_id' AND
    ( (CAST('$date_start' AS DATE) BETWEEN date_start AND date_end) OR
    (CAST('$date_end' AS DATE) BETWEEN date_start AND date_end) OR
    (CAST('$date_start' AS DATE) < date_start AND
    CAST('$date_end' AS DATE) > date_end))

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

Discussions similaires

  1. SELECT DATE BETWEEN ? AND ?
    Par kamel_smd dans le forum JDBC
    Réponses: 2
    Dernier message: 13/02/2008, 11h31
  2. probleme date between
    Par nou366 dans le forum Bases de données
    Réponses: 5
    Dernier message: 06/06/2006, 08h28
  3. Réponses: 4
    Dernier message: 27/04/2006, 13h21
  4. Ambiguity between 'TBitmap' and 'Windows::TBitmap' ???
    Par scifire dans le forum C++Builder
    Réponses: 2
    Dernier message: 18/01/2005, 12h44
  5. Réponses: 2
    Dernier message: 23/06/2004, 16h06

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