Zur Navigation

Anzahl Tage frei

1 webuser

Hallo,
in einem Belegungsplan habe ich Anfahrt und Abfahrt im Dateformat.
Wenn z.B. die nächste freie Anfahrt in 9 Tage ist, dann das Echo
"9Tage frei"

$result = mysqli_query($conn,"
SELECT Anfahrt, Abfahrt FROM belegung
WHERE Anfahrt = DATE( DATE_SUB( NOW() , INTERVAL 14 DAY ) ) ORDER BY Anfahrt asc LIMIT 1");
Aber wenn jetzt aber belegt ist und die die nächste freie
Anfahrt am 20.Juni ist, darf nichts gefunden werden.
Der Zeitraum muss über 2 Tage sein.
Wenn heute der 11.Juni ist:
z.B. Einträge
1)
Anfahrt: 5.Juni Abfahrt: 19.Juni
Anfahrt: 20.Juni Abfahrt: 27.Juni
Dann nichts frei.

2)
Anfahrt: 20.Juni Abfahrt: 27.Juni
Dann "echo 9Tage ab sofort frei".

3)
Anfahrt: 12.Juni Abfahrt: 27.Juni
Dann nichts frei.

Gruß
Webuser

11.06.2017 07:14

2 Jörg

Als erstes würde ich überprüfen, ob es in den nächsten zwei Tagen Belegungen gibt, also so in etwa:

SELECT COUNT(*)
FROM belegung
WHERE (Anfahrt < NOW() AND Abfahrt > NOW())
   OR (Anfahrt < DATE_ADD(NOW(), INVERAL 2 DAY) AND Abfahrt > DATE_ADD(NOW(), INVERAL 2 DAY))

Falls eine Zahl höher 0 wiedergegeben wird, würde ich "nichts frei" ausgeben, anderfalls in einer zweiten Query abfragen, in wievielen Tagen die Anfahrt der nächsten Belegung ist, was ich so probieren würde:

SELECT DATEDIFF(Anfahrt, NOW())
FROM belegung
WHERE Anfahrt >= DATE_ADD(NOW(), INTERVAL 2 DAY)
ORDER BY Anfahrt ASC
LIMIT 1

11.06.2017 18:45 | geändert: 11.06.2017 18:46

3 webuser

Hallo,
das finden der Belegung scheint nicht richtig zu selektieren:
Von heute bis zur nächsen Anfahrt müssen min. 3 Tage liegen
(unter 3 Tage wir nichts gezeigt)
Vielleicht finden wir erst mal das nächste Anreisedatum in den nächsten 14Tagen, wenn jetzt frei ist:

heute der 11.Juni
Belegung
1)
vom 20.5 bis 28.5
vom 5.Juni bis 19.Juni
vom: 20.Juni bis: 27.Juni
>kein Datum da heute belegt
2)
vom 20.5 bis 28.5
vom: 20.Juni bis: 27.Juni
>echo: von heute bis 20. Juni frei

3)
vom 20.5 bis 28.5
vom: 13.Juni bis: 27.Juni
>kein Datum (da zu wenig Tage bis zur nächsten Anfahrt)

Gruß
Webuser

12.06.2017 20:03

4 Jörg

das finden der Belegung scheint nicht richtig zu selektieren:
Von heute bis zur nächsen Anfahrt müssen min. 3 Tage liegen
(unter 3 Tage wir nichts gezeigt)

Du kannst ja die Werte von 2 auf 3 erhöhen (INTERVAL 3 DAY) - haut es dann hin? wenn es heute bis überübermorgen eine Belegung gibt, sollte ein Zahl größer Null zurückgegeben werden.

Vielleicht finden wir erst mal das nächste Anreisedatum in den nächsten 14Tagen, wenn jetzt frei ist:

Wieso 14 Tage? wenn die nächste Anreise in 17 Tagen beginnt, ist sie nicht mehr relevant?

Was für ein Ergebnis gibt denn meine zweite Query zurück? diese sollte die Anzahl der Tage zurückgeben, die bis zur Anfahrt der ersten Belegung vergehen, welche frühestens in zwei Tagen beginnt. Du kannst wie gesagt den Abstand aber auch auf drei Tage erhöhen.

12.06.2017 21:51 | geändert: 12.06.2017 21:55

5 webuser

Hallo Jörg,
die ursprügliche Idee war, das ich einen bestimmten Text für eine kurzfristige freie Belegung schreibe. Aber es ist vielleicht einfacher wenn ich den Zeitraum-14Tage- bis zur nächsten Buchung einfach komplett weglasse. Dann kann ich bei Bedarf einfach mit Datediff die Tage ausrechnen und flexibel den Text schreiben. Auch den Zeitraum >2 brauche ich dann nicht. Das macht das ganze doch viel einfacher.
Wichtig ist nur das ich das nächste Anreisedatum erhalte (wenn jetzt nicht belegt ist)
Manchmal verrennt man sich und man macht es sich zu kompliziert.

Gruß
Webuser

13.06.2017 07:17

6 Jörg

Wichtig ist nur das ich das nächste Anreisedatum erhalte (wenn jetzt nicht belegt ist)

Das sollte mit den beiden Queries möglich sein, die du auch einfach über phpMyAdmin testen kannst. Die Auswertung der Queries und die Fallunterscheidung muss in PHP erfolgen. Falls du da nicht weiterkommst, oder irgendwas unklar ist bei den Queries, gib Bescheid, dann erläutere ich das noch im Detail.

13.06.2017 13:59

7 webuser

Hallo Jörg,

es ist nicht so einfach, die nächste Anfahrt zu finden wenn jetzt frei ist.
Wenn heute belegt ist, darf nichts gefunden werden.

So hatte ich es probiert:

$result = mysqli_query($conn,"
    SELECT Anfahrt, Abfahrt, wid FROM belegung
    WHERE  not (Abfahrt < CURDATE() and Anfahrt > CURDATE()) and Anfahrt > CURDATE()  ORDER BY Anfahrt asc LIMIT 1");
 if (!$result)
                {
                die("Error: Data not found..");
                }
$data=mysqli_fetch_assoc($result);

$abfahrt = new DateTime($data['Abfahrt']);
$today = new DateTime();
$diff = $abfahrt->diff($today);
$diff = $diff->format('%d');

13.06.2017 19:27

8 Jörg

Du benötigst zwei Abfragen: in der ersten werden die blockierenden Belegungen ermittelt, in der zweiten die erste Belegung nach heute

Ich hatte mir das so gedacht:

$result = mysqli_fetch_assoc(mysqli_query($conn, "
SELECT COUNT(*) AS aktuelle_belegungen
FROM belegung
WHERE (Anfahrt < NOW() AND Abfahrt > NOW())
   OR (Anfahrt < DATE_ADD(NOW(), INTERVAL 3 DAY) AND Abfahrt > DATE_ADD(NOW(), INTERVAL 3 DAY))
"));
if ($result['aktuelle_belegungen'] > 0) {
    // ein oder mehrere Belegungen in den nächsten Tagen
    echo 'nichts frei';
} else {
    $result = mysqli_fetch_assoc(mysqli_query($conn, "
    SELECT DATEDIFF(Anfahrt, NOW()) AS anzahl_freie_tage
    FROM belegung
    WHERE Anfahrt >= CURDATE()
    ORDER BY Anfahrt ASC
    LIMIT 1
    "));
    echo $result['anzahl_freie_tage'] . ' Tage ab sofort frei';
}

... ist aus dem Kopf gecodet und mangels Datenbank natürlich ungetestet :) falls das nicht wie gewünscht funktioniert, schau mal, ob irgendwelche PHP-Fehler oder MySQL-Fehler (mit mysqli_error()) ausgegeben werden

13.06.2017 22:03 | geändert: 13.06.2017 22:07

1 Forenmitglied fand diesen Beitrag gut

9 webuser

vielen Dank Jörg-spitzenmäßig!!!

13.06.2017 23:03

Beitrag schreiben (als Gast)





[BBCode-Hilfe]