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 :

Problème pour gerer des réservations


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 73
    Points : 60
    Points
    60
    Par défaut [Résolu] Problème pour gerer des réservations
    Bonjour à tous.

    Mon problème est le suivant :

    J'ai 2 tables,
    chambres(id,libelle) clé primaire id
    reservations(id,chambre_id,date_A,date_D) clé primaire id, et étrangère chambre_id ...

    date_A correspond à la date d'arrivée (le soir)
    date_D correspond à la date de départ (le matin)

    Je voudrais faire une vérification des chambres réservées, pour ainsi savoir si un client peut réserver à une date donnée.

    Je suis partie sur la réflexion qu'il fallait que je trouve dans une requete sql les chambres libres, voilà ce que j'ai fait :
    Pour savoir si il y a une chambre de libre pour les dates du 04 janvier 2010 au 05 janvier 2010
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select chambres.id from chambres where chambres.id in (select id_chambre from reservations where date_A <= "2010-01-05" and date_D <= "2010-01-04");
    Soit afficher les id des chambres où la date d'arrivée est inférieure ou égale (car il y a la notion de matin et soir) à la date de départ de ma réservation, et où la date de départ est inférieure ou égale à la date d'arrivé de ma réservation.

    La requête ne fonctionne pas bien suivant le jeu d'essai...

    Si vous avez une idée

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 39
    Points : 45
    Points
    45
    Par défaut
    Bonjour

    Il faut prendre le problème en sens inverse :
    Tu veux les chambres pour lesquelles il n'y a A PAS de réservation qui fini après la date d'arrivée et qui commence avant la date de départ Modification de ta requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT chambres.id FROM chambres WHERE chambres.id NOT IN (SELECT id_chambre FROM reservations WHERE date_A < "2010-01-05" AND date_D > "2010-01-04")
    Suivant ton SGBD tu peut avoir des fonctions sur les dates (between etc..) qui pourraient être bien pratiques..

  3. #3
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Pour les recoupements de périodes, l'opérateur OVERLAPS est le plus pratique, mais il n'est pas pris en charge par tous les SGBD. Quel est le tien ?
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 73
    Points : 60
    Points
    60
    Par défaut
    Merci pour votre rapidité, j'utilise mysql

    La solution de iGwendal, fonctionne très bien, et en effet j'ai utilisé between également, cependant il semblerait qu'avec between les bornes soient incluses ca m'embêtait fortement (avec l'histoire de matin et soir).

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 39
    Points : 45
    Points
    45
    Par défaut
    sur developpez il y'a un excellent tuto sur les dates mysql et comme par hasard un des exemples concerne un système de réservation de chambres d'hôtel..
    http://pcaboche.developpez.com/artic...rvations_hotel

    Je n'ai pas le temps de l'étudier en détail mais peut être que ça te seras utile..

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 73
    Points : 60
    Points
    60
    Par défaut
    en effet le tuto reponds parfaitement à ce que j'attendais merci beaucoup, toutefois je reste perplexe sur la requête qui après l'avoir remis à mon gout et quand même beaucoup plus longue et compliqué que l'autre (qui est exécuté plus rapidement) pour le même résultat ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT chambres.id FROM chambres LEFT OUTER JOIN reservations
    ON (chambres.id = reservations.id_chambre AND (
          '2010-01-11' BETWEEN date_A AND date_D
       OR '2010-01-12'   BETWEEN date_A AND date_D
       OR date_A BETWEEN '2010-01-11' AND '2010-01-12'
       OR date_D  BETWEEN '2010-01-11' AND '2010-01-12'
      ))
    WHERE reservations.id_chambre IS NULL;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT chambres.id FROM chambres WHERE chambres.id NOT IN (SELECT id_chambre FROM reservations WHERE date_A < '2010-01-12' AND date_D > '2010-01-11')

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 39
    Points : 45
    Points
    45
    Par défaut
    Hum je n'avais pas vu le dernier message.

    Je ne suis pas un expert en optimisation SQL mais AMHA si la requête est plus lisible et s'exécute plus rapidement à première vue... le choix est vite fait..

    tag [Résolu]?

Discussions similaires

  1. [Système] Problème pour effectuer des calculs
    Par tissard dans le forum Langage
    Réponses: 10
    Dernier message: 09/12/2005, 14h07
  2. [win] problème pour partager des fichiers entre 2 pc
    Par goma771 dans le forum Administration
    Réponses: 1
    Dernier message: 01/12/2005, 16h15
  3. [XML word] problème pour créer des puces
    Par ratapapa dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 21/07/2005, 13h52
  4. Problème pour Télécharger des fichiers
    Par joce3000 dans le forum C++Builder
    Réponses: 8
    Dernier message: 21/01/2005, 10h30
  5. problème pour faire des blocs
    Par tinkye_winkye dans le forum Mise en page CSS
    Réponses: 6
    Dernier message: 04/01/2005, 14h13

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