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

PHP & Base de données Discussion :

Rechercher un intervale de durée [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2006
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2006
    Messages : 61
    Par défaut Rechercher un intervale de durée
    Bonjour,

    Je travail sous php 5 et mysql 5

    j'ai lu plusieurs post ici qui traite des recherches par date mais aucun ne correspond à mon problème donc je vous l'expose.

    Ce que je veux faire c'est rechercher une saison ou plus. Une saison est défini pour une date de début et une date de fin.

    Les deux champs qui enregistre les dates dans la table saison sont au format date (aaaa-mm-jj).

    J'ai un formulaire pour la recherche qui demande de saisir une date de début et une date de fin (tout est au bon format aaaa-mm-jj).

    Donc pour effectuer la recherche je fais ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT * FROM Saison 
    WHERE Lim_basse <= '".$Date_debut."' 
    AND Lim_haute >= '".$Date_fin."'
    Cette requête marche partiellement car si ma date début est sur la saison 1 et que ma date de fin est sur la saison 2 par exemple du coup rien ne retourne aucun résultat.

    Exemple :

    Saison 1 => début : 2007-12-15 / fin : 2008-05-30
    Saison 2 => début : 2008-05-31 / fin : 2008-07-30

    Soit la recherche suivante => début : 2008-01-23 / fin 2008-03-01
    La requête vas bien me retourner la saison 1. de même si je fais une recherche ou là date de début est supérieur ou égale au début d'une saison et dont la la date de fin est inférieur ou égal à la date de fin de saison.

    Si la date de fin pour la recherche fait partie d'une autre saison, aucun résultat n'ai retourné
    Ex: recherche => début : 2008-01-23 / fin 2008-06-01
    Retourne aucun résultat alors que je voudrai que ça me retourne Saison 1 et Saison 2.

    Merci d'avance si voyais comment faire

  2. #2
    Membre émérite Avatar de sharrascript
    Homme Profil pro
    Développeur Web indépendant
    Inscrit en
    Avril 2007
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web indépendant

    Informations forums :
    Inscription : Avril 2007
    Messages : 678
    Par défaut
    Bonsoir,

    Je ne suis pas sûr d'avoir tout piger.

    Mais si tu veux avoir les saisons qui tombe dans les bonnes tranches, enlève le AND et remplace le par OR.

    Ensuite, le plus logique est d'inverser les supérieurs et inférieurs, il me semble que le bon code serait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT * FROM Saison 
    WHERE Lim_basse >= '".$Date_debut."' 
    OR Lim_haute <= '".$Date_fin."'
    Mais je peux me tromper

    ++

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2006
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2006
    Messages : 61
    Par défaut
    nop pas possible d'inverser parce que la date début ne peux pas être inférieur à la date de début d'une saison et la date de fin ne peux pas être supérieur à la date de fin d'une saison.

    Et mettre un OR ça ne vas non plus enfin je crois faut que je teste car une saison est défini par une date de début et une date de fin et le moteur de recherche permet de choisir une date de début et une date de fin.

    Il faut donc qu'avec ces deux date je sache dans quelles saison je me trouve.

    Si jamais vous ne comprenez pas demander moi quel point je dois éclaircir

  4. #4
    Membre émérite Avatar de sharrascript
    Homme Profil pro
    Développeur Web indépendant
    Inscrit en
    Avril 2007
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web indépendant

    Informations forums :
    Inscription : Avril 2007
    Messages : 678
    Par défaut
    Citation Envoyé par polemoss
    nop pas possible d'inverser parce que la date début ne peux pas être inférieur à la date de début d'une saison et la date de fin ne peux pas être supérieur à la date de fin d'une saison.
    C'est donc bien ce que j'ai mis dans mon code, tu va chercher toutes les saisons qui contiennent un résultat compris entre une date de début et une date de fin.

    Ensuite, si tu met un AND, c'est une condition obligatoire donc si la demande n'est pas comprise obligatoirement entre les deux = pas de résultat, donc ce que tu souhaite est impossible.

    exemple:
    Saison 1 => début : 2007-12-15 / fin : 2008-05-30
    Saison 2 => début : 2008-05-31 / fin : 2008-07-30

    Soit la recherche suivante => début : 2008-01-23 / fin 2008-03-01

    Pour choisir une saison tu dois bien sortir une date de début supérieur ou égale à 2008-01-23 (donc Lim_basse >= '".$Date_debut."') ensuite une date de fin inférieur ou égale à 2008-03-01 (donc Lim_haute <= '".$Date_fin."')

    Puis si tu met un AND la saison 2 ne peut pas être choisie car la date de début est inférieur, alors qu'avec le OR pas de soucis, seulement une des deux conditions doit être bonne, ce qui me parait logique.

    Voilà ++

  5. #5
    Membre confirmé Avatar de greg13
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 144
    Par défaut
    Après y avoir quand même bien réfléchi, je pense que la solution est plus compliquée, voilà ce que je propose, mais sans grande certitude, faudrait tester :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    "
    SELECT * FROM Saison 
    WHERE 
    ( Lim_haute >= '".$Date_debut."' AND Lim_haute <= '".$Date_fin."' )
    OR
    ( Lim_basse >= '".$Date_debut."' AND Lim_basse <= '".$Date_fin."')
    "
    J'ai supposé que l'on peut mettre des parenthèse dans la requete, je n'ai jamais fait ça donc, je suis pas certain. Mais voilà mon idée

    Greg

  6. #6
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2006
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2006
    Messages : 61
    Par défaut
    Citation Envoyé par sharrascript Voir le message
    exemple:
    Saison 1 => début : 2007-12-15 / fin : 2008-05-30
    Saison 2 => début : 2008-05-31 / fin : 2008-07-30

    Soit la recherche suivante => début : 2008-01-23 / fin 2008-03-01

    Pour choisir une saison tu dois bien sortir une date de début supérieur ou égale à 2008-01-23 (donc Lim_basse >= '".$Date_debut."') ensuite une date de fin inférieur ou égale à 2008-03-01 (donc Lim_haute <= '".$Date_fin."')

    Puis si tu met un AND la saison 2 ne peut pas être choisie car la date de début est inférieur, alors qu'avec le OR pas de soucis, seulement une des deux conditions doit être bonne, ce qui me parait logique.

    Voilà ++
    Bon j'ai tester donc je te réponds pas dans le vide

    Si je recherche une saison dont le début de la saison est supérieur à la date de début recherchée et que je recherche en même temps via la condition OR une date de fin de saison inférieur à la date de fin recherchée cela me retourne toutes les saisons de ma table Saison ce qui est somme toute logique donc autant faire un SELECT * FROM Saison et je traite ensuite en PHP par dichotomie, chose que je voudrais justement éviter de faire pour plus de rapidité d'exécution.

    Ceci dit je suis d'accord avec toi que l'opérateur AND n'est pas approprié car s'il y a un chevauchement de saison les conditions ne sont pas remplis, donc ça retourne aucun enregistrement c'est normale.

    Quant à la proposition de greg je suis ok avec toi sur le faite que ça parait simple mais que ça ne l'est pas lol je me suis fait moi même surprendre je pensais régler cette requête en quelques minutes, mais t'a proposition n'est pas bonne je l'ai également tester et cela ne retourne aucun résultat et c'est logique.
    Car tu recherche :
    1 ) une date de fin de saison qui soit supérieur à la date début recherchée avec une date de fin de saison qui soit inférieur à la date de fin de saison recherchée.
    ou
    2) une date de début de saison qui soit supérieur à la date début recherchée avec une date de début de saison qui soit inférieur à la date de fin de saison recherchée.

    Donc c'est pas bon tout ça.

    De mon côté je n'ai guère avancé plus (Je me suis surtout éclairci les idées sur la requête) mais je vous tiens au courant en espérant qu'on trouve une soluce )

    A + dans pas trop longtemps j'espère

  7. #7
    Membre émérite Avatar de sharrascript
    Homme Profil pro
    Développeur Web indépendant
    Inscrit en
    Avril 2007
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web indépendant

    Informations forums :
    Inscription : Avril 2007
    Messages : 678
    Par défaut
    Re polemoss,

    Citation Envoyé par polemoss
    Si je recherche une saison dont le début de la saison est supérieur à la date de début recherchée et que je recherche en même temps via la condition OR une date de fin de saison inférieur à la date de fin recherchée cela me retourne toutes les saisons de ma table Saison ce qui est somme toute logique donc autant faire un SELECT * FROM Saison et je traite ensuite en PHP par dichotomie, chose que je voudrais justement éviter de faire pour plus de rapidité d'exécution.
    Avec combien de saisons traite tu??

    Si tu traite avec 2 saisons et qu'elles sont toutes deux comprises entre l'intervalle, normal que cela te ressorte tout.

    Ensuite, à tu bien inversé comme je l'ai fait supérieur et inférieur, parce que avec ce que je t'ai donné comme code, je te certifie que si tu fais une requête avec :

    début : 2007-01-23 / fin 2007-03-01

    Aucune des 2 saisons ne ressortira, donc c'est très loin du SELECT * FROM Saison

    Voilà ++

  8. #8
    Membre confirmé Avatar de greg13
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 144
    Par défaut
    J'ai encore un peu modifier mon idée et maintenant ma méthode à l'air de fonctionner j'ai fait le test avec phpmyamdin et mysql : voila la table que j'ai créé avec des enregistrements :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    CREATE TABLE `saisons` (
      `num` tinyint(3) unsigned NOT NULL auto_increment,
      `saison` varchar(20) NOT NULL,
      `limdebut` date NOT NULL,
      `limfin` date NOT NULL,
      PRIMARY KEY  (`num`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;
     
     
    INSERT INTO `saisons` (`num`, `saison`, `limdebut`, `limfin`) VALUES 
    (1, 'janvier', '2008-01-01', '2008-01-31'),
    (2, 'fevrier', '2008-02-01', '2008-02-29'),
    (3, 'mars', '2008-03-01', '2008-03-31'),
    (4, 'avril', '2008-04-01', '2008-04-30'),
    (5, 'mai', '2008-05-01', '2008-05-31');
    ensuite j'ai effectuer cette requete pour trouver les saisons de 05 février au 5 avril:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT * FROM `saisons` WHERE 
    (`limfin` >= '2008-02-05'  AND `limfin`<='2008-04-05')
    OR
    (`limdebut` >= '2008-02-05'  AND `limdebut`<='2008-04-05')
    OR
    (`limfin` >= '2008-02-05' AND `limdebut`<='2008-04-05')
    cela me renvoi février, mars, avril.

    Un autre test avec les dates du 5 mars au 10 mars :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT * FROM `saisons` WHERE 
    (`limfin` >= '2008-03-05'  AND `limfin`<='2008-03-10')
    OR
    (`limdebut` >= '2008-03-05'  AND `limdebut`<='2008-03-10')
    OR
    (`limfin` >= '2008-03-05' AND `limdebut`<='2008-03-10')
    cela me renvoi mars.

    Donc voilà j pense que c'est bon, si c'est bien ça que tu veux.

    Greg

  9. #9
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2006
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2006
    Messages : 61
    Par défaut
    Greg Bravo je te remercie c'est bien ça.

    Par contre sharrascript je pense que tu dois confondre la limite rechercher et la limite enregistrer dans la table parce que tu me dis de faire ça :

    imaginons un cas simple

    Saison 1 => Début : 2008-01-24 Fin 2008-02-24

    Je recherche une période qui vas de 2008-01-29 à 2008-02-15.

    Je fais ma requête tel que tu veux que je la fasse ça fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT * FROM Saison WHERE lim_basse >= '2008-01-29' AND lim_haute <= '2008-02-15'
    En imaginant que j'ai un seul enregistrement dans ma table ça fait ça :

    2008-01-24>=2008-01-29 AND 2008-02-24<= 2008-02-15

    Forcement ça ne retourne pas d'enregistrement en effet le 24 janvier c'est pas supérieur au 29 janvier et le 24 février est pas inférieur au 15 février y'a qu'un cas ou ça marche c'est quand ont est égale.

    En tout cas Je vous remercie de m'avoir aider et Greg même si ça marche je suis encore entrain d'essayer de comprendre ta requête car je vois pas pourquoi elle marche

    Merci A plus

  10. #10
    Membre confirmé Avatar de greg13
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 144
    Par défaut
    Ok ben de rien, et bonne réflexion face à cette complexe requête

    Greg

  11. #11
    Membre émérite Avatar de sharrascript
    Homme Profil pro
    Développeur Web indépendant
    Inscrit en
    Avril 2007
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web indépendant

    Informations forums :
    Inscription : Avril 2007
    Messages : 678
    Par défaut
    Exact désolé, je viens de réellement piger ce que vous souhaitez faire,

    La solution du début de greg est correct et plus courte:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT * FROM Saison WHERE (lim_basse <= '".$Date_debut."' AND  lim_haute >= '".$Date_debut."')  OR (lim_haute <= '".$Date_fin."' AND lim_basse <= '".$Date_fin."')

  12. #12
    Membre confirmé Avatar de greg13
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 144
    Par défaut
    J'ai testé celle là et elle ne fonctionnait pas si l'on fesait une recherche avec deux dates qui rentrait dans la même saison. C'est pour ça que j'ai rajouter un OR et une ligne.

    Greg

  13. #13
    Membre émérite Avatar de sharrascript
    Homme Profil pro
    Développeur Web indépendant
    Inscrit en
    Avril 2007
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web indépendant

    Informations forums :
    Inscription : Avril 2007
    Messages : 678
    Par défaut
    Ha oui, ma requête est légèrement différente, regarde ou tu avais fait une différence, dans la position des $Date_debut et $Date_fin, normalement, comme je l'ai positionné, ça devrait marcher

    ++

  14. #14
    Membre confirmé Avatar de greg13
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 144
    Par défaut
    A partir de ton test :
    Ceci est la premiere partie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    (lim_basse <= '".$Date_debut."' AND  lim_haute >= '".$Date_debut."')
    Elle renvoi toutes les saisons pour lesquelles la date de debut (que tu recherches) en fait partie. Donc theoriquement une saison ( si aucune saison ne se superpose)

    La deuxieme partie de ton test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     (lim_haute <= '".$Date_fin."' AND lim_basse <= '".$Date_fin."')
    Elle renvoi toutes les saisons pour lequelles la lim_haute et la lim_basse sont plus petit que la date de fin. Donc toutes les saisons avant de que tu cherches et pendant.
    Là y a un débordement. Donc ne peut fonctionner.

    Par exemple pour la requete 2008-03-05 à 2008-03-10. Ca retourne Janvier, février, et mars. Et s'il y avait encore d'autres saisons antérieur, elle serait aussi listée.

    Greg

  15. #15
    Membre émérite Avatar de sharrascript
    Homme Profil pro
    Développeur Web indépendant
    Inscrit en
    Avril 2007
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web indépendant

    Informations forums :
    Inscription : Avril 2007
    Messages : 678
    Par défaut
    Je dois pas comprendre ce qui est demandé désolé,

    Mais pour moi c'est le fonctionnement normal, si la saison va de janvier à Avril, alors je trouvais normal qu'elle ressorte en tapant ta requête... Mais je dois être hors contexte... Désolé...

  16. #16
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2006
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2006
    Messages : 61
    Par défaut
    En fait il faut retourner les saisons ou la saisons par rapport à une date de début et une date de fin rechercher.

    prenons les exemples de Greg

    Saison Janvier début 2008-01-01 Fin 2008-01-31
    Saison Février début 2008-02-01 Fin 2008-02-29
    Saison Mars début 2008-03-01 Fin 2008-03-31
    Saison Avril début 2008-04-01 Fin 2008-04-30
    ect .... jusqu'à décembre

    Ont recherche une période du 15 février au 25 février, la requête doit retourné que Février, ça c'était pas dur à faire. Il suffisait de vérifier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lim_basse <= $date_debut AND lim_haut >= $date_fin
    .

    ça complique quand une période chevauche plusieurs saisons car la requête retourne aucun résultat et c'est normal.
    Imagine tu recherche une période du 10 Janvier au 15 Mars, la requête doit retourner Janvier, Février, Mars.
    c'est pour ça qu'on vérifie tout ça que je viens comprendre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        lim_haute >= '".$Date_debut."'  AND lim_haute<='".$Date_fin."'
        OR
        lim_basse >= '".$Date_debut."'  AND lim_basse<='".$Date_fin."'
        OR
        lim_haute >= '".$Date_debut."' AND lim_basse<='".$Date_fin."'
    En espérant t'avoir aider à comprendre ce que je recherchais

    A+

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

Discussions similaires

  1. Rechercher des intervalles dans une table
    Par Allegro dans le forum Requêtes
    Réponses: 11
    Dernier message: 11/12/2012, 21h42
  2. [XL-2010] Besoin Usf qui permet recherche selon intervalle de date
    Par duplaly dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 15/03/2011, 21h49
  3. [libxml2] Recherche d'intervalle
    Par moisix dans le forum XML
    Réponses: 0
    Dernier message: 21/04/2010, 01h06
  4. recherche multicritère - intervalle dates
    Par melitoriva dans le forum IHM
    Réponses: 2
    Dernier message: 03/01/2008, 15h11
  5. intervalle de temps ds recherche
    Par fsautejeau dans le forum Access
    Réponses: 13
    Dernier message: 21/07/2006, 09h30

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