# MySQL Zeitraumsuche - Belegung



## Salami_Charly (22. Januar 2007)

Hallo an Alle,

ich möchte für einen Belegungsplan eine Zeitraumsuche realisieren.

Die Abfrage soll Objekte liefern die im gewünschten (zusammenhängenden) Zeitraum als Vermietobjekt zur Verfügung stehen, d.h. einen Buchungsstaus ungleich 2 (belegt) besitzen.

Folgende Tabellen kommen zu Einsatz:


```
table.rental
ID (PK)
Name (Varchar)
```


```
table.rental_res
ID (PK)
Object_ID (FK)
Vac_Day (date) z.B. 2007-01-22
Status (int)
```

Für jeden Tag lege ich für das entsprechende Objekt einen
Datensatz an, der angibt welcher Status das Objekt hat.


Mit der Abfrage:


```
SELECT DISTINCT rental.Name
FROM rental, rental_res
WHERE rental.ID=rental_res.Object_ID
AND Vac_Day BETWEEN '2007-01-21' AND '2007-01-25' AND Status != 2;
```

bekomme ich leider auch dann Treffer wenn im betreffenden Zeitraum
ein Status von 1 oder 3 zutrifft. Es sollen aber nur zusammenhängende
Zeiträume angezeigt werden.

Vielen Dank schon mal
Alexander


----------



## Salami_Charly (24. Januar 2007)

Hallo noch mal,

hat denn keiner einen Tipp für mich?  

Also ich möchte nur Treffer angezeigt bekommen, wenn ein Objekt in einem zusammenhängenden Zeitraum komplett als nicht belegt  zur Verfügung steht.

Ist das Datenbank-Design nicht glücklich gewählt?

Ich vermute ja, dass ich irgendwie mit einem LEFT JOIN arbeiten muss
aber ich weiß wirklich nicht so genau wie das geht.

Ich habe schon etliche Stunden mit Suche verbracht aber leider keinen passenden Ansatz gefunden.

Vielen Dank schon mal
Alexander


----------



## splasch (27. Januar 2007)

Also mit BETWEEN erhälst du nur werte die Darin enthalten sind (wert1,wert2 unsw.) In deinem fall würd ich es mal mit Größer oder Kleiner Probieren. where datumfeld < 2007.04.05 and datumfeld > 2000.04.05

So kanste eine Zeit raum eingrenzen (von bis).In dem Fall sollte man dann alle Werte bekommen die Zwischen 2007.03.05 und 2000.05.05 liegen


----------



## Funjoy (27. Januar 2007)

Hallo,

Wenn ich dich jetzt richtig verstanden habe willst du eine Abfrage haben wo der Gast/User selber schauen kann ob das Objekt vermietet ist oder nicht und wenn ja wie lange?

Jetzt müsste man wissen welcher Status für was ist, also die 2 steht für Buchungen? Und für was steht die 1 und die 3? 

Gruß Funjoy


----------



## Salami_Charly (1. Februar 2007)

Hallo zusammen,

leider hat die Benachrichtigung vom Forum nicht funktioniert. 
Deshalb habe ich jetzt erst gesehen dass ihr geantwortet habt.

Habe in der Zwischenzeit die Lösung gefunden, wenn auch mit Hilfe eines
SQL Cracks auf http://www.sitepoint.com

Hier nochmals die Problemstellung:
Belegungsplan mit Zeitraumsuche, die nur Treffer anzeigt,wenn im gesuchten Zeitraum
alle Buchungstage einen Buchungsstatus ungleich 2 haben.

Status: 0 = unbekannt, 1 = frei, 2 = belegt, 3 = wechsel

Tabellen (gekürzt)
tabelle.rental
ID (PK)
Name (Varchar)

tabelle.rental_res
ID (PK)
Object_ID (FK)
Vac_Day (date) z.B. 2007-01-22
Status (int)

Hier die Lösung: Hole alle Datensätze, je Objekt, die einen Buchungsstatus ungleich 2 haben
und zähle die gefundenen Anzahl Tage und vergleiche sie mit der gewünschten Anzahl Tage.
Wenn beides übereinstimmt ist die Bedingung erfüllt und das Objekt ist verfügbar.


```
select rental_res.ID 
  from rental_res
 where Vac_Day between '2007-01-25' 
                   and '2007-01-31'
   and Status != 2
group
    by Rental_ID
having count(*) = to_days('2007-01-31')
                 -to_days('2007-01-25') + 1
```

Genial einfach; wenn man denn drauf kommt.

Die Verbindung mit dem Objekt habe ich über einen einfachen Join hergestellt:


```
where rental.ID=rental_res.Object_ID
```

Hoffe dass das noch jemand hilft!


----------

