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 :

Vérifier s'il y a une row dans un intervalle de temps donné


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 28
    Points : 22
    Points
    22
    Par défaut Vérifier s'il y a une row dans un intervalle de temps donné
    Bonjour à tous,

    pour un projet pour l'école je fais un système de réservation d'avion pour baptême de l'air.
    Lors de la demande de location d'un avion, l'utilisateur rentre la date qu'il souhaite, et le programme lui dit si un vol est déjà prévu à cette date et pendant cette tranche horaire qu'il aura spécifié. C'est justement pour la tranche horaire que j'ai du mal... J'ai essayé overlaps mais ca ne convient pas.

    Voici le code que j'ai fait et qui me semble le plus proche de ce que je veux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT * 
    FROM logbooks 
    WHERE ID NOT IN (
      SELECT ID
      FROM logbooks 
      WHERE arrivalTime > CAST( '16:00:00' AS time ) 
      AND departureTime < CAST( '14:30:00' AS time )  
    )
    Merci d'avance pour votre aide !

  2. #2
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 152
    Points : 1 414
    Points
    1 414
    Par défaut
    Pourquoi utiliser une sous-requête, cette requête donnera satisfaction (si j'ai bien compris)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT * -- Guerre des étoiles à éviter ;)
    FROM logbooks 
    WHERE 
      arrivalTime > CAST( '16:00:00' AS time ) 
      AND departureTime < CAST( '14:30:00' AS time )
    Mais la logique est-elle correcte ?
    Les vols qui partent AVANT 14h30 ET arrivent APRES 16h00 ?

  3. #3
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    Votre requête ne cherche pas les vols dont la période chevauche celle saisie mais les vols existants qui n'incluent pas la période saisie.

    Cherchez simplement les vols dont la période chevauche. Nul besoin de sous requête pour ça.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 28
    Points : 22
    Points
    22
    Par défaut
    Bonjour, je pense m'être mal exprimé.
    Et ma logique doit être fausse. Tout ce que j'essaye de faire, c'est de vérifier si un vol est dispo. C'est à dire si il n'y a pas déjà un vol à cette tranche horaire.

    Les valeurs 14h30 et 16h00 sont uniquement des essais pour ma BDD. Ce seront des bindvalue dans mon code PHP, c'est à dire ce que l'utilisateur demande comme horaire.

    Cordialement.

  5. #5
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 152
    Points : 1 414
    Points
    1 414
    Par défaut
    Les valeurs 14h30 et 16h00 sont uniquement des essais pour ma BDD. Ce seront des bindvalue dans mon code PHP, c'est à dire ce que l'utilisateur demande comme horaire.
    j'avais bien compris, mais la logique me troublait ...

    As tu regarde ce petit papier ? http://sqlpro.developpez.com/cours/gestiontemps/#L1.2.2

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 28
    Points : 22
    Points
    22
    Par défaut
    Citation Envoyé par dehorter olivier Voir le message
    j'avais bien compris, mais la logique me troublait ...

    As tu regarde ce petit papier ? http://sqlpro.developpez.com/cours/gestiontemps/#L1.2.2
    Merci de votre réponse, oui je l'ai vu et je n'arrive pas à faire fonctionner OVERLAPS. En effet, j'ai toujours un message d'erreur. On dirait que MySQL ne comprend pas OVERLAPS... Pourtant la commande est dispo sur le site officiel http://dev.mysql.com/doc/refman/5.0/...eometries.html ...

    Si quelqu'un a une autre commande je suis preneur :/

  7. #7
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    l'OVERLAPS que vous mentionnez ne traite que le chevauchement entre types géométriques. Or ici, c'est pour du temporel. MySQL n'implémente pas Overlaps.

    L'article qu'on vous a donné donne l'ensemble de conditions derrière le prédicat OVERLAPS. Vous pouvez les exprimer même si la fonction n'existe pas sous MySQL.

  8. #8
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    L'ordre de création de la fonction pour MySQL qui reprend les conditions données dans l'article :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE FUNCTION OVERLAP (d1 datetime, f1 datetime, d2 datetime, f2 datetime) RETURNS boolean DETERMINISTIC 
    BEGIN
    RETURN (d1 > d2 AND (d1 < f2 OR f1 < f2)) OR
           (d2 > d1 AND (d2 < f1 OR f2 < f1)) OR
           (d1 = d2 AND (NOT ISNULL(f1) AND NOT ISNULL(f2))) ;
    END

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 28
    Points : 22
    Points
    22
    Par défaut
    Citation Envoyé par vmolines Voir le message
    l'OVERLAPS que vous mentionnez ne traite que le chevauchement entre types géométriques. Or ici, c'est pour du temporel. MySQL n'implémente pas Overlaps.

    L'article qu'on vous a donné donne l'ensemble de conditions derrière le prédicat OVERLAPS. Vous pouvez les exprimer même si la fonction n'existe pas sous MySQL.
    Merci de votre réponse, cela explique donc pourquoi Overlaps ne fonctionne pas. Cependant, comme je l'ai dit, j'avais déjà lu votre article, sans trouver réponse à ma question. Je n'ai pas un niveau élevé en SQL malheureusement.

    Pourriez-vous m'aider à trouver la réponse à mon problème ?

    EDIT : Je n'avais pas vu votre double post, merci

  10. #10
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 170
    Points : 7 422
    Points
    7 422
    Billets dans le blog
    1
    Par défaut
    La superposition d'intervalles de temps est toujours un bordel sans nom en SQL.

    Il faut voir si :

    debut_intervalle1 between debut_intervalle2 and fin_intervalle2
    or
    fin_intervalle1 between debut_intervalle2 and fin_intervalle2
    or
    debut_intervalle2 between debut_intervalle1 and fin_intervalle1
    or
    fin_intervalle2 between debut_intervalle1 and fin_intervalle1

    A priori, le dernier "or" est inutile.

    Il faut vérifier les cas suivants :
    - intervalle1 et intervalle2 se chevauchent en partie seulement
    - intervalle1 est totalement inclut dans intervalle2
    - intervalle2 est totalement inclut dans intervalle1

  11. #11
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    Citation Envoyé par gogetenk Voir le message
    Merci de votre réponse, cela explique donc pourquoi Overlaps ne fonctionne pas. Cependant, comme je l'ai dit, j'avais déjà lu votre article, sans trouver réponse à ma question. Je n'ai pas un niveau élevé en SQL malheureusement.

    Pourriez-vous m'aider à trouver la réponse à mon problème ?

    EDIT : Je n'avais pas vu votre double post, merci
    Il n'y a aucune complexité "SQL" dans les conditions données dans l'article. Prenez juste le temps de bien comprendre pourquoi cette ribambelle de conditions, les schémas sont biens faits.

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 28
    Points : 22
    Points
    22
    Par défaut
    Citation Envoyé par StringBuilder Voir le message
    La superposition d'intervalles de temps est toujours un bordel sans nom en SQL.

    Il faut voir si :

    debut_intervalle1 between debut_intervalle2 and fin_intervalle2
    or
    fin_intervalle1 between debut_intervalle2 and fin_intervalle2
    or
    debut_intervalle2 between debut_intervalle1 and fin_intervalle1
    or
    fin_intervalle2 between debut_intervalle1 and fin_intervalle1

    A priori, le dernier "or" est inutile.

    Il faut vérifier les cas suivants :
    - intervalle1 et intervalle2 se chevauchent en partie seulement
    - intervalle1 est totalement inclut dans intervalle2
    - intervalle2 est totalement inclut dans intervalle1

    Merci à vous pour cet algorithme, c'était là ou se situait mon erreur. Tout marche maintenant !

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 21/05/2017, 00h52
  2. [Débutant] Changer couleur d'une row dans un Datagridview bindé
    Par jeremyvb11 dans le forum VB.NET
    Réponses: 5
    Dernier message: 13/01/2013, 15h32
  3. sélectionner une row dans une DataGridView
    Par Shadam dans le forum VB.NET
    Réponses: 5
    Dernier message: 05/05/2011, 10h18
  4. Selectionner une row dans DataGridView
    Par boulo dans le forum Windows Forms
    Réponses: 3
    Dernier message: 28/03/2007, 00h17
  5. [MySQL] Introduire une variable dans requête SQL, insérer des données à la volée
    Par Ronan.f dans le forum PHP & Base de données
    Réponses: 18
    Dernier message: 29/04/2006, 22h10

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