Hallo Com
Ich habe ein riesen Problem, an dem ich langsam zu verzweifeln drohe.
Ich soll einen Belegzeitenkalender auslesen und die buchbaren Tage anzeigen lassen.
Alles dreht sich hier um Ferienobjekte, die zu bestimmten Zeiten belegt sind, aber zwischen den Belegungen noch Kapazitäten frei haben.
Der Suchende gibt nun eine Zeitraum ein von wann bis wann er in etwa Urlaub geplant hat und möchte in dieser Zeit nur eine bestimmte Anzahl von Tagen dort verweilen.
Er gibt also in eine Suchmaske die drei Daten ein und erwartet ein entsprechendes Ergebnis.
Ich habe jetzt eine Funktion geschrieben die mir alle Belegungen aus der Tabelle ausliest und das letzte Belegungsdatum zurückgibt.
Das klappt bis hierhin auch schon ganz gut.
Nun zu dem Problem.
In der Belegungstabelle sind folgende Daten vorhanden
Belegt von 20101013 bis 20101020 und 20101023 bis 20101030
Gesucht wird der Zeitraum 20101015 - 201026 wo 7 Tage frei sein sollten.
Meine Funktion findet nun das Datum 20101020 und gibt mir dieses zurück, weil der nächste Zeitraum größer ist als das angeforderte.
Jetzt möchte ich aber auch den letzten Eintrag haben und quasi die Anzahl der freien Tage zwischen dem 20101020 - 20101023 ermitteln.
Ist dieser Wert nun kleiner als die geforderten Tage so soll mir dieses Objekt nicht zurückgegebn werden.
Ich hoffe ich habe mich einigermaßen verständlich ausgedrückt.
Hier mal die Funktion:
(Wundert euch nicht über die Tabellenfeldnamen, ist nicht von mir, ich arbeite quasi auf einer DB die ich nicht selbst erstellt habe)
PHP-Code:
// Zeige alle Objekte an die irgend was frei haben im genannten Zeitraum
public static function test($objectId,$dayFrom,$dayTo,$realDay) {
$qry_belegt="SELECT
*
FROM
vakanzen
WHERE
objekt_nr='".$objectId."'
AND
((von <= '".$dayFrom."' AND bis >= '".$dayFrom."')
OR
(von <= '".$dayTo."' AND '".$dayTo."' >= '".$dayTo."')
OR
('".$dayFrom."' <= von AND '".$dayTo."' >= bis))
ORDER BY
bis ASC
";
$res_belegt = mysql_query($qry_belegt);
while($row = mysql_fetch_array($res_belegt)) {
if(Search::getTimestamp($row["bis"]) >= Search::getTimestamp($dayTo)) { // Timestamp ermitteln und vergleichen
continue;
} else {
$obj = $row["objekt_nr"];
}
}
return $obj;
}
public static function getTimestamp($date) {
$y = substr($date,0,4);
$m = substr($date,4,2);
$d = substr($date,6,2);
return strtotime($y."-".$m."-".$d);
}
Ich denke das ist ein Abfragproblem, bin aber im Moment dermaßen vernagelt im Kopf das ich nicht auf die Lösung komme.
Ich habe es schon mit folgender Variante versucht, was aber nicht hinhaut:
PHP-Code:
// Timestamp Datum von bis aus DB
$bis = Search::getTimestamp($row["bis"]);
// Timestamp Datum Übergabe
$dayBis = Search::getTimestamp($dayTo);
// Abfrage ob das letzte Buchungsdatum größer als die Übergabe ist
if($bis <= $dayBis) {
//Abfrage ob Tage übereinstimmen
$frei = $dayBis - $bis;
$test = $frei / 86400;
if($test < $realDay) {
$obj = $row["objekt_nr"];
$b = date("d.m.Y",$bis);
}
}
Ich bin dankbar über jegliche Art der Hilfe oder Anregung wie man das Problem am besten angeht.
MfG Mad