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

MySQL Discussion :

Trouver la période commune à plusieurs plage de dates


Sujet :

MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 18
    Par défaut Trouver la période commune à plusieurs plage de dates
    Bonjour,

    Je post sur ce forum car je rencontre une certaine difficulté à écrire une requête SQL et j'aurais aimer savoir si vous pouviez m'aiguiller pour trouver une solution..

    Je m'explique, pour mon projet, je réalise un site internet sous Symfony.

    Ce site est destiné à une association qui souhaite organiser des départs en vacances. Pour ce faire un tableau de disponibilités est à leur disposition. Chaque membre de l'association peut ajouter une plage de disponibilités pour un séjour donné.

    J'ai donc dans ma base de données PHPMyAdmin une table intitulée "Availability" (disponibilité) qui contient entre autres un champs "date de début" et "date de fin" (dateFrom et dateTo).

    Ce que je souhaite mettre en place est une recherche de la plage de date commune à toutes les disponibilités. J'aimerai faire une requête qui parcoure toutes les disponibilités qui se chevauchent et qui me récupère la période la plus commune.

    J'avoue qu'après plusieurs recherches et réflexions je ne vois pas trop comment mettre en place ma requête. J'avais pensé à une intersection des plages de dates qui seraient dans les tables Availability1 et Availability2 avec les jours de la première table qui existent dans la deuxième et qui me retourne la date de début et date de fin de la période la plus commune.

    Je vous ai mis en pièces-jointes les captures d'écran de la page du tableau des disponibilité du site, ainsi que ma table MySQL.

    Si vous avez du temps je vous en remercie par avance ou si vous pouviez m'aiguiller vers une documentation qui pourrait m'aider.

    Cordialement.

    Nom : Capture d’écran 2015-04-16 à 11.31.27.png
Affichages : 1916
Taille : 120,6 KoNom : Capture d’écran 2015-04-16 à 12.03.09.png
Affichages : 1777
Taille : 48,4 Ko

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 818
    Billets dans le blog
    14
    Par défaut
    La requête ci-dessous va donner la date de début la plus lointaine et la date de fin la plus proche.
    Si la date de fin trouvée est supérieure ou égale à la date de début trouvée, alors c'est la plage de dates commune à tous, sinon, il n'y a pas de plage de dates commune.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT MAX(dateFrom) AS debut_periode_commune,
    	MIN(dateTo) AS fin_periode_commune,
    FROM Availability
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 la suite Linux Mageïa !

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 18
    Par défaut
    Merci beaucoup pour la réponse, en effet la solution est peut être bien plus simple que je ne pouvais m'imaginer :/

    Cependant j'ai testé cette requête dans PHPMyAdmin mais il me renvoie ceci une erreur de syntaxe apparemment:

    MySQL a répondu: Documentation

    #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FROM Availability
    LIMIT 0, 30' at line 3

  4. #4
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 818
    Billets dans le blog
    14
    Par défaut
    Il y a une virgule en trop avant le FROM.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 la suite Linux Mageïa !

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 18
    Par défaut
    Autant pour moi après vérification la requête prend le jour de début maximum et la date de fin minimum, cependant il prends ces dates même si elles ne font pas partie des autres plages de disponibilités.

    Par exemple dans mon cas j'ai ces dispos:

    Du 02-02-2017 au 10-03-2017
    Du 13-06-2015 au 09-07-2015
    Du 01-01-2017 au 16-09-2017

    et il me retourne :

    02/02/17 au 09/07/15

    alors que je voudrai:

    du 02-02-2017 au 10-03-2017 à savoir celle qui est comprise dans les autres plages de disponibilité et dont les jours sont compris dans les autres périodes.

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 18
    Par défaut
    Il faudrait peut être rajouter une condition qui vérifie l'existence des dates dans les autres périodes. ce n'est pas réalisable avec l'équivalent d'un INTERSECT en MySQL?

  7. #7
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 818
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par pierrotDev867 Voir le message
    Autant pour moi après vérification la requête prend le jour de début maximum et la date de fin minimum, cependant il prends ces dates même si elles ne font pas partie des autres plages de disponibilités.
    /
    Par exemple dans mon cas j'ai ces dispos:

    Du 02-02-2017 au 10-03-2017
    Du 13-06-2015 au 09-07-2015
    Du 01-01-2017 au 16-09-2017

    et il me retourne :

    02/02/17 au 09/07/15

    alors que je voudrai:

    du 02-02-2017 au 10-03-2017 à savoir celle qui est comprise dans les autres plages de disponibilité et dont les jours sont compris dans les autres périodes.
    Euh... du 02/02/2017 au 10/03/2017, ce n'est pas compris dans la plage du 13/06/2015 au 09/07/2015 !
    Quand bien même cette dernière période serait située en 2017 comme les deux autres, la première période n'aurait rien de commun avec la deuxième.

    C'est donc bien ce que j'ai dit dans mon message :
    Citation Envoyé par CinéPhil
    Si la date de fin trouvée est supérieure ou égale à la date de début trouvée, alors c'est la plage de dates commune à tous, sinon, il n'y a pas de plage de dates commune.
    Le besoin exprimé était celui-ci :
    Citation Envoyé par pierrotDev867
    Ce que je souhaite mettre en place est une recherche de la plage de date commune à toutes les disponibilités.
    Si vous voulez filtrer sur certaines plages à analyser, il faut ajouter un WHERE à ma requête. Ainsi, si on exclue de la requête la deuxième plage de votre liste ci-dessus, ma requête devrait bel et bien donner la plage du 02/02/2017 au 10/03/2017.

    Il faudrait peut être rajouter une condition qui vérifie l'existence des dates dans les autres périodes. ce n'est pas réalisable avec l'équivalent d'un INTERSECT en MySQL?
    INTERSECT n'existe pas en MySQL et ne serait même d'aucune utilité ici. Il existe aussi, en SQL, la fonction OVERLAPS mais qui n'existe pas non plus chez MySQL.

    Vous pouvez lire ce billet de SQLPro sur les calculs sur les périodes :
    http://sqlpro.developpez.com/cours/gestiontemps/
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 la suite Linux Mageïa !

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

Discussions similaires

  1. Requête sur plusieurs plages de dates
    Par Paninak dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 18/12/2012, 15h57
  2. Trouver une valeur commune à plusieurs enregistrements
    Par chezgligli dans le forum Requêtes
    Réponses: 5
    Dernier message: 07/09/2011, 08h30
  3. [Dates] Trouver une période à partir d'un DATETIME
    Par Space Cowboy dans le forum Langage
    Réponses: 6
    Dernier message: 06/03/2007, 14h55
  4. [SQL Server 8] Trouver une plage de date
    Par Baquardie dans le forum Langage SQL
    Réponses: 3
    Dernier message: 11/04/2006, 19h30
  5. critère de période commun à plusieurs requete
    Par Nicko29 dans le forum Access
    Réponses: 4
    Dernier message: 26/09/2005, 20h46

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