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 :

Requête tranche horaire disponibilité


Sujet :

Requêtes MySQL

  1. #1
    Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 94
    Points : 65
    Points
    65
    Par défaut Requête tranche horaire disponibilité
    Bonjour,
    voilà, j'ai une base de données avec une table reservation contenant un identifiant véhicule (clef étrangère de la table véhicule), un horaire de départ et un horaire d'arrivé.

    Exemple :
    Id_vehicule : 1
    Heure depart : 15: 00:00
    Heure d'arrivée : 17:00:00

    Id_vehicule : 1
    Heure depart 05:00:00
    Heure d'arrivée 08 :00:00

    Je voudrais afficher tous les véhicules disponibles entre, par exemple 10:00:00
    et 12:00:00, donc ici en l'occurence le véhicule 1.

    Voilà une semaine que je galère, j'ai tout essayé, Between, < ou> etc.., quelqu'un a t'il une idée, merci...


    [Titre modifié par Maximilian]

  2. #2
    Membre expert
    Avatar de TheLeadingEdge
    Inscrit en
    Mai 2005
    Messages
    1 199
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 1 199
    Points : 3 103
    Points
    3 103
    Par défaut
    Bonsoir,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT 	DISTINCT (id_vehicule)
    FROM	reservation
    WHERE 	id_vehicule NOT IN
    (
    SELECT 	id_vehicule
    FROM	reservation 
    WHERE	depart BETWEEN '10:00:00' AND '12:00:00'
    OR	retour BETWEEN '10:00:00' AND '12:00:00'
    );

  3. #3
    Membre éprouvé
    Avatar de Biglo
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 537
    Points : 984
    Points
    984
    Par défaut
    Bonsoir,

    Juste une petite optimisation à la réponse de TheLeadingEdge.

    Il vaut mieux faire le premier SELECT sur la table Vehicule directement : il y aura sûrement moins de lignes à parcourir que sur réservation. Et de plus, le DISTINCT n'est plus nécessaire.

  4. #4
    Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 94
    Points : 65
    Points
    65
    Par défaut
    Citation Envoyé par Biglo
    Bonsoir,

    Juste une petite optimisation à la réponse de TheLeadingEdge.

    Il vaut mieux faire le premier SELECT sur la table Vehicule directement : il y aura sûrement moins de lignes à parcourir que sur réservation. Et de plus, le DISTINCT n'est plus nécessaire.

    Merci beaucoup TheLeadingEdge, mais penses tu que cette requête fonctionne dans les deux sens, c'est à dire sur la disponibilité ou l'indisponibilité d'un véhicule ?
    Car c'est surtout cela qui me posait des problèmes...

  5. #5
    Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 94
    Points : 65
    Points
    65
    Par défaut
    Citation Envoyé par TheLeadingEdge
    Bonsoir,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT 	DISTINCT (id_vehicule)
    FROM	reservation
    WHERE 	id_vehicule NOT IN
    (
    SELECT 	id_vehicule
    FROM	reservation 
    WHERE	depart BETWEEN '10:00:00' AND '12:00:00'
    OR	retour BETWEEN '10:00:00' AND '12:00:00'
    );

    si je fais les deux requêtes suivantes , avec les données ci dessous:

    id_vehicule :1
    heure_depart_resa :06:00:00
    heure arrivee_resa : 11:00:00

    id_vehicule : 1
    heure_depart_resa :06:00:00
    heure arrivee_resa : 11:00:00

    id_vehicule : 1
    heure_depart_resa :17:00:00
    heure arrivee_resa : 19:00:00


    SELECT libelle_vehicule
    FROM vehicule
    WHERE id_vehicule NOT IN
    (
    SELECT id_vehicule
    FROM reservation
    WHERE heure_depart_resa BETWEEN '06:00:00' AND '11:00:00'
    OR heure_arrivee_resa BETWEEN '06:00:00' AND '11:00:00'
    );


    il ne m'affiche pas id_vehicule 1, par contre si j'éxécute la requête :

    SELECT libelle_vehicule
    FROM vehicule
    WHERE id_vehicule NOT IN
    (
    SELECT id_vehicule
    FROM reservation
    WHERE heure_depart_resa BETWEEN '17:00:00' AND '19:00:00'
    OR heure_arrivee_resa BETWEEN '17:00:00' AND '19:00:00'
    );

    il m'affiche id_vehicule 1, est ce normal....merci encore à the Leading Edge, c'est cool d'avoir des réponses aussi rapides....

  6. #6
    Membre expert
    Avatar de TheLeadingEdge
    Inscrit en
    Mai 2005
    Messages
    1 199
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 1 199
    Points : 3 103
    Points
    3 103
    Par défaut
    Re,

    J'ai répondu 1 peu trop vite d'ailleurs. Y'avait 1 truc qui me chagrinait en envoyant, mais je ne trouvais pas quoi.
    J'avais oublié le cas ou ton véhicule est parti avant et revient après.

    Ensuite, si j'ai compris ce que tu demandes ds ton 2nd post, tu veux la liste de ts les véhicules avec leur état.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT 	DISTINCT libre.id_vehicule,
    	CASE WHEN occupe.id_vehicule IS NULL THEN 'libre' ELSE 'occupe' END  AS etat
    FROM	reservation libre
    LEFT JOIN reservation occupe
    ON 	( occupe.id_vehicule = libre.id_vehicule AND occupe.depart BETWEEN '10:00:00' AND '12:00:00' )
    OR	( occupe.id_vehicule = libre.id_vehicule AND occupe.retour BETWEEN '10:00:00' AND '12:00:00')
    OR 	( occupe.id_vehicule = libre.id_vehicule AND occupe.depart < '10:00:00' AND occupe.retour > '12:00:00')

  7. #7
    Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 94
    Points : 65
    Points
    65
    Par défaut
    Citation Envoyé par TheLeadingEdge
    Re,

    J'ai répondu 1 peu trop vite d'ailleurs. Y'avait 1 truc qui me chagrinait en envoyant, mais je ne trouvais pas quoi.
    J'avais oublié le cas ou ton véhicule est parti avant et revient après.
    [/CODE]
    Merci encore TheLeadingEdge, je vois que tu as du en résoudre des problèmes pour me proposer une requête aussi pointu, je vais essayer de la déchiffrer pour l'appliquer, car même si je ne me débrouille pas trop mal, j'aurais été incapable de réaliser cette requête. je la teste et je te dis si cela fontionne, j'aurais du venir avant sur ce forum...si j'avais su que les participants étaient ausi cool.....

  8. #8
    Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 94
    Points : 65
    Points
    65
    Par défaut Problème d'heure de départ
    Citation Envoyé par jeremie74
    Merci encore TheLeadingEdge, je vois que tu as du en résoudre des problèmes pour me proposer une requête aussi pointu, je vais essayer de la déchiffrer pour l'appliquer, car même si je ne me débrouille pas trop mal, j'aurais été incapable de réaliser cette requête. je la teste et je te dis si cela fontionne, j'aurais du venir avant sur ce forum...si j'avais su que les participants étaient ausi cool.....

    En appliquant ta logique et en fesant quelques modifs j'arrive à effectivement ne pas afficher les véhicules qui correspondent à une plage horaire déjà utilisé.
    Exemple :

    SELECT libelle_vehicule
    FROM vehicule
    WHERE id_vehicule NOT
    IN (

    SELECT id_vehicule
    FROM reservation
    WHERE heure_depart_resa
    BETWEEN '06:00:00'
    AND '11:00:00'
    OR (
    heure_arrivee_resa
    BETWEEN '06:00:00'
    AND '11:00:00'
    )
    OR (
    heure_depart_resa < '06:00:00'
    AND heure_arrivee_resa > '11:00:00'
    )
    )


    Mais uniquement, si je précise l'heure de départ exact...car si je mets par exemple 07:00:00 10:00:00, il m'affiche le véhicule alors que ce véhicule est pris de 06:00:00 à 11:00:00..comment y remédier...merci....

  9. #9
    Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 94
    Points : 65
    Points
    65
    Par défaut Ok cela fonctionne..
    Par défaut [Résolu] Ok c'est bon avec TIME...merci beaucoup TheLeadingEdge
    Citation:
    TheLeadingEdge a écrit :
    Re,

    Les bornes du BETWEEN sont comprises dans l'intervalle, donc normalement ça devrait être bon.
    J'ai essayé avec les données que tu donnes et ta rq et pour moi c'est ok.
    J'ai aussi fait 1 essai avec des heures pas tout à fait 'pleines' au cas ou ... Mais c'est ok qd même, la troisième restriction couvrant ce cas là. Peux tu envoyer 1 select du contenu de tes tables ? parce que là je séche !

    Code :

    mysql> SELECT * -> FROM reservation; +-------------+-------------------+--------------------+ | id_vehicule | heure_depart_resa | heure_arrivee_resa | +-------------+-------------------+--------------------+ | 1 | 06:00:00 | 11:00:00 | | 1 | 16:00:00 | 19:00:00 | | 2 | 06:00:01 | 11:00:01 | | 2 | 16:00:01 | 19:00:01 | +-------------+-------------------+--------------------+ 4 rows in set (0.00 sec) mysql> mysql> SELECT id_vehicule -> FROM vehicule -> WHERE id_vehicule NOT IN -> ( -> SELECT id_vehicule -> FROM reservation -> WHERE heure_depart_resa BETWEEN '07:00:00' AND '11:00:00' -> OR (heure_arrivee_resa BETWEEN '07:00:00' AND '11:00:00') -> OR (heure_depart_resa < '07:00:00' AND heure_arrivee_resa > '11:00:00') -> ); Empty set (0.00 sec) mysql>



    Cela fonctionne , c'est parcreque comme un imbécile que je suis, j'avais oublié de mettre TIME(heure_depart_resa) alors que ma collonne est de type DATETIME et c'est pour cela...
    Voilà donc ma requête définitive qui fonctionne (alllelllouuyyaaaa) :

    SELECT libelle_vehicule
    FROM vehicule
    WHERE id_vehicule NOT
    IN (

    SELECT id_vehicule
    FROM reservation
    WHERE TIME( heure_depart_resa )
    BETWEEN '12:00:00'
    AND '17:00:00'
    OR (
    TIME( heure_arrivee_resa )
    BETWEEN '12:00:00'
    AND '17:00:00'
    )
    OR (
    TIME( heure_depart_resa ) < '12:00:00'
    AND TIME( heure_arrivee_resa ) > '17:00:00'
    )
    )

    Merci beaucoup, beaucoup...ton aide a été plus que précieuse, et me sauve d'une prise de tête qui dure depuis une semaine....
    c'est le problème de bosser en Freelance...

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

Discussions similaires

  1. requête min et max sur tranche horaire
    Par PhilLU dans le forum Requêtes
    Réponses: 3
    Dernier message: 20/08/2013, 14h17
  2. Création d'une requête d'activité par tranche horaire
    Par Logarithmix dans le forum Requêtes
    Réponses: 7
    Dernier message: 28/09/2011, 10h50
  3. requête par tranche horaire et par jour
    Par lieselotte dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 04/05/2009, 12h57
  4. Récupérer des enregistrements par tranche horaire
    Par olive_le_malin dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 19/05/2006, 16h53
  5. Calcul de tranches horaires
    Par zach dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 02/08/2005, 08h26

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