2010-11-27 23 views
3

J'écris un programme de réservation simple pour une location de voiture (une tâche d'école). Mon copain et moi essayons de faire en sorte que le système soit un peu plus avancé que ce que la mission l'exige, mais nous avons des problèmes avec lesquels nous espérions que vous pourriez nous aider. L'idée est que vous pouvez réserver un certain type de voiture, et quand vous obtenez la voiture, elle sera de ce type (vous ne réservez pas une voiture spécifique, comme notre mission l'exige, mais seulement un type). Un seul client peut avoir la voiture à une date précise. Comme les réserves coïncident, nous devons nous assurer que nous ne louons pas plus de voitures de chaque type que nous avons. Les réservations sont essentiellement stockées avec une date de début, une date de fin et un type de voiture.Vérification des réservations de voitures qui se chevauchent

Si nous ignorons le type de voiture pour l'instant (laisse dire que nous n'avons un type), alors les réserves pourraient chercher graphiquement quelque chose comme ceci:

1/12 2/12 3/12 4/12 5/12 6/12 7/12 
|-------------------| 
        |-----------------| 
           |-----| 
|-------| 
          |-----------| 
|-------------| 

Si la location a seulement trois voitures, il serait possible de louer une voiture du 3/12 au 5/12 car tous les jours seulement 2 réservations de voiture. Mais comment le savons-nous? Devons-nous vérifier chaque date et compter() le nombre de réservations qui s'étendent sur cette date?

Et si quelqu'un avait réservé une voiture sur 4/12, puis 3/12 et 5/12 serait encore seulement avoir 2 réserves, mais 4/12 aurait 3.

Serait-il possible de le faire avec une question comment, ou devons-nous passer par chaque date dans le programme pour vérifier le nombre de réservations n'a pas dépassé le nombre de voitures? (Ceci est assez facile avec seulement des dates complètes, mais considérez le scénario où vous pourriez louer les voitures sur une base horaire (pas seulement sur un quotidien comme ici) .Il pourrait alors être un pour traverser chaque notre si nous avons beaucoup de réservations et de voitures et le temps est long ...)

J'espère que vous avez quelques bonnes idées qui nous aideront. Merci d'avoir pris le temps de lire la question :)

  • Mikkel, Danemark
+1

double possible de [déterminer si deux Plage de dates chevauchement] (http://stackoverflow.com/questions/325933/determine-whether-two-date-ranges-overlap) –

+0

Il est considérablement plus complexe que de simplement déterminer si deux plages de dates se chevauchent. –

Répondre

1

« Serait-il possible de le faire avec une requête d'une façon ou devons-nous parcourir chaque jour dans la programme pour vérifier le nombre de réservations n'a pas dépassé le nombre de voitures? (Ceci est assez facile avec seulement des dates complètes, "

La nature de votre problème est qu'une violation de la contrainte pourrait apparaître à une date individuelle. Donc en toute logique, il est en effet nécessaire de faire le chèque pour chaque date individuelle comprise dans une nouvelle réservation. la synchronisation possible serait de faire le contrôle au niveau des "plus petits intervalles". Pour ce faire, vous devez d'abord calculer tous les intervalles qui apparaissent déjà dans la base de données et qui se chevauchent avec votre nouvelle réservation.

Par exemple, une nouvelle réservation pour 4/12-6/12 devrait être divisée en 4/12-5/12 (deuxième ligne) et 5/12-6/12 (troisième ligne). Ces intervalles individuels peuvent être plus longs qu'un seul jour et vous pouvez effectuer les vérifications au niveau de ces intervalles individuels. (Ils sont les mêmes que les jours individuels dans cet exemple particulier, mais une réservation 7/12-19/12 ne devrait pas être divisée du tout.)

Cependant, le calcul pourrait s'avérer difficile, et il y a une autre mise en garde: quand Si vous cherchez des insertions à plusieurs lignes, vous devriez également séparer les autres lignes à insérer (ce qui nécessite d'enregistrer toutes les lignes insérées dans une table temporaire, sinon vous ne pourrez pas y accéder).

1

Supposons, vous avez cette situation de réservation dans la vie réelle:

 1/12 2/12 3/12 4/12 5/12 6/12 7/12 
Car1: |-------------------| 
Car2:      |-----------------| 
Car3: |-------|  |-----------|  |-----|        
Car4: |-------------| 

Tableau car

| id | type | registration | 
| 1 | 1 | HH1111  | 
| 2 | 1 | HH3333  | 
| 3 | 2 | HH77   | 
| 4 | 3 | DD999  | 

Tableau reservation

| car_id | date_from | date_to | 
| 1  | 2013-12-01 | 2013-12-04 | 
| 2  | 2013-12-04 | 2013-12-07 | 
| 3  | 2013-12-01 | 2013-12-02 | 
| 3  | 2013-12-03 | 2013-12-05 | 
| 3  | 2013-12-06 | 2013-12-07 | 
| 4  | 2013-12-01 | 2013-12-03 | 

Maintenant, vous devez par une logique très simple, sélectionnez toutes les voitures disponibles pour la période

de 2013-12-05 à 2013-12-06

« Sélectionner toutes les voitures, qui n'a pas de réservation avec les dates, ce qui bloque pour l'utilisation » avec brillian mysql sélectionnez:

select * from car where not exists (select * from reservation 
where car.id = reservation.car_id AND 
date_from < '2013-12-06' AND 
date_to > '2013-12-05')