Alle Tage zwischen zwei Datumsangaben in Datenbank abspeichern

Frinias

Benutzer
Beiträge
5
Hallo zusammen,

bei meinem aktuellen sollen wir von der Schule aus eine Website aufsetzen, bei der man eine Ferienwohnung reservieren kann.
Über einen normalen Registrierungsprozess habe ich bereits alle persönlichen Daten, sowie An- und Abreisedatum in die Datenbank aufgenommen.
Was bisher fehlt, sind alle Tage, die evtl. zwischen An- und Abreise liegen. Auch sie müssen beleget werden, damit es anderen nicht möglich ist, in diesem Zeitraum zu reservieren. Im Internet habe ich bisher leider nur gefunden, wie man Differenzen zwischen zwei Tagen berechnet. Könnt ihr mir vielleicht bei dem Problem helfen?

Beste Grüße
Frinias
 
Werbung:
Verstehe ich nicht.
Morgens Abreise, danach Anreise, normal werden Übernachtungen gebucht.
Solange minimal eine Übernachtung mit definierten, nicht überschneidenden Aus und Einlasszeiten gebucht werden kann, gibt es das Problem nicht oder?
 
welche version setzt ihr ein (MySQL / MariaDB) ?

Aber ich denke das ihr das mit WHERE oder BETWEEN erledigen könnt

UPDATE yourTable
set reserviert = true
WHERE dateInTable BETWEEN startdate AND enddate;

Damit wird in der Tabelle an allen Tagen reserviert auf TRUE gesetzt
 
Zuletzt bearbeitet:
Verstehe ich nicht.
Morgens Abreise, danach Anreise, normal werden Übernachtungen gebucht.
Solange minimal eine Übernachtung mit definierten, nicht überschneidenden Aus und Einlasszeiten gebucht werden kann, gibt es das Problem nicht oder?
Tut mir leid, dass ich mich schlecht ausgedrückt habe.
Natürlich handelt es sich um Übernachtungen. Diese werden begrenzt durch den Tag der Anreise und der Abreise. Diese beiden Tage gibt der Kunde an, wenn er das Reservierungsformular ausfüllt. Jetzt müssen allerdings alle evtl. dazwischenliegenden Tage (bei zwei oder mehr Übernachtungen) ebenfalls in der Datenbank hinterlegt werden. Wie man das macht, war meine Frage.
 
welche version setzt ihr ein (MySQL / MariaDB) ?

Aber ich denke das ihr das mit WHERE oder BETWEEN erledigen könnt

UPDATE yourTable
set reserviert = true
WHERE dateInTable BETWEEN startdate AND enddate;

Damit wird in der Tabelle an allen Tagen reserviert auf TRUE gesetzt
Sorry, aber ich glaube, Du hast das Problem nicht verstanden. Es geht darum, daß es für eine Ressource (hier eine FeWo) durchaus über das Jahr mehrere Buchungen geben kann, die sich aber nicht gegenseitig überlappen würden, weil das dann eine Doppelbuchung/Überbuchung wäre.
Mit PostgreSQL klassisches Bispiel für Einsatz DATERANGE für den Buchungszeitraum und einem EXCLUSION CONSTRAINT zur Verhinderung einer Überbuchung - nur kann MySQL (egal, welche Version) dies nicht.

Mein Beispiel dazu wurde aber entfernt.

Das mit den Mitteln von MySQL nachzubauen wird schwierig und unperformant, aber vielleicht hast Du ja eine Lösung ... ich kann Dir die PG-Weg gern noch einmal erklären ;-)
 
welche version setzt ihr ein (MySQL / MariaDB) ?

Aber ich denke das ihr das mit WHERE oder BETWEEN erledigen könnt

UPDATE yourTable
set reserviert = true
WHERE dateInTable BETWEEN startdate AND enddate;

Damit wird in der Tabelle an allen Tagen reserviert auf TRUE gesetzt
Wir nutzen MySQL.
Tut mir leid für die dumme Frage, jedoch bin ich total neu in dem Thema.
Ich nehme an, dass dateInTable eine eigene Spalte ist. Ich habe die eben mal der Tabelle hinzugefügt. Der Befehl wurde auch bestätigt, jedoch hat sich leider nichts verändert.
 
Wir nutzen MySQL.
Tut mir leid für die dumme Frage, jedoch bin ich total neu in dem Thema.
Ich nehme an, dass dateInTable eine eigene Spalte ist. Ich habe die eben mal der Tabelle hinzugefügt. Der Befehl wurde auch bestätigt, jedoch hat sich leider nichts verändert.

Ich gehe davon aus, daß @BerndB das Problem falsch verstanden hat. Ja, er meinte offensichtlich eine extra spalte in der Tabelle, allerdings wohl reserviert und nicht dateInTable. Angenommen, du hast 2 andere Spalten, startdate und enddate, und wendest das SQL so an, dann würde das Update das Feld reserviert passend setzen - nur hilft Dir das kaum oder gar nicht, weil Du immer noch eine Überbuchung eingeben kannst.

Mal sehen, was er sagt ...
 
Hallo @akretschmer,

ich wollte da keine Verwirrung stiften. Ich davon ausgegangen das es eine Tabelle git, wo jeder Tag / Zimmer schon vorhanden ist
und du nur an den Tagen Sachen eintragen musst. SET reserviert = true war nur als Platzhalter gedacht, da es keine Angaben
über die Tabelle gab.

Aber meine Frage hatte schon einen Sinn ob MySQL oder MariaDB. Beide haben im Unterschied zu PostgreSQL nicht nur eine
ACID-compliant storage engine, sondern beliebig viele.

Und bei MariaDB gibt es eine Sequence Storage Engine mit der man solche Sache sehr gut lösen kann.

Beispiel:

SQL:
MariaDB [test]> TRUNCATE bb;
Query OK, 0 rows affected (0.028 sec)

MariaDB [test]> INSERT INTO bb (mydate,myroom)
    -> SELECT DATE(NOW()+  INTERVAL seq DAY),19
    -> FROM seq_0_to_1000
    -> WHERE DATE(NOW() + INTERVAL seq DAY ) BETWEEN '2022-04-01' AND '2022-04-07';
Query OK, 7 rows affected (0.004 sec)
Records: 7  Duplicates: 0  Warnings: 0

MariaDB [test]> SELECT * from bb;
+----+------------+--------+
| id | mydate     | myroom |
+----+------------+--------+
|  1 | 2022-04-01 |     19 |
|  2 | 2022-04-02 |     19 |
|  3 | 2022-04-03 |     19 |
|  4 | 2022-04-04 |     19 |
|  5 | 2022-04-05 |     19 |
|  6 | 2022-04-06 |     19 |
|  7 | 2022-04-07 |     19 |
+----+------------+--------+
7 rows in set (0.001 sec)

MariaDB [test]>

Aber solange nicht bekannt ist wie die Tabelle oder das Query aussieht kann ich nur raten und die
Glaskugel hat mir das gesagt.

LG Bernd
 
Zuletzt bearbeitet:
Tut mir leid, dass ich mich schlecht ausgedrückt habe.
... Jetzt müssen allerdings alle evtl. dazwischenliegenden Tage (bei zwei oder mehr Übernachtungen) ebenfalls in der Datenbank hinterlegt werden. Wie man das macht, war meine Frage.
Kein Problem, ich habe Dich falsch verstanden.
Wenn alle Tage dazwischen, also zwischen An und Abreise explizit reserviert und gespeichert werden müssen/sollen, sind das viele überflüssige Informationen.
Wie es geht hat @BerndB ja nun dargestellt.
 
Tut mir leid, dass ich mich schlecht ausgedrückt habe.
Natürlich handelt es sich um Übernachtungen. Diese werden begrenzt durch den Tag der Anreise und der Abreise. Diese beiden Tage gibt der Kunde an, wenn er das Reservierungsformular ausfüllt. Jetzt müssen allerdings alle evtl. dazwischenliegenden Tage (bei zwei oder mehr Übernachtungen) ebenfalls in der Datenbank hinterlegt werden. Wie man das macht, war meine Frage.
Liest sich aber nicht so
 
Hallo @akretschmer,

ich wollte da keine Verwirrung stiften. Ich davon ausgegangen das es eine Tabelle git, wo jeder Tag / Zimmer schon vorhanden ist
und du nur an den Tagen Sachen eintragen musst. SET reserviert = true war nur als Platzhalter gedacht, da es keine Angaben
über die Tabelle gab.

Aber meine Frage hatte schon einen Sinn ob MySQL oder MariaDB. Beide haben im Unterschied zu PostgreSQL nicht nur eine
ACID-compliant storage engine, sondern beliebig viele.

Und bei MariaDB gibt es eine Sequence Storage Engine mit der man solche Sache sehr gut lösen kann.

Beispiel:

SQL:
MariaDB [test]> TRUNCATE bb;
Query OK, 0 rows affected (0.028 sec)

MariaDB [test]> INSERT INTO bb (mydate,myroom)
    -> SELECT DATE(NOW()+  INTERVAL seq DAY),19
    -> FROM seq_0_to_1000
    -> WHERE DATE(NOW() + INTERVAL seq DAY ) BETWEEN '2022-04-01' AND '2022-04-07';
Query OK, 7 rows affected (0.004 sec)
Records: 7  Duplicates: 0  Warnings: 0

MariaDB [test]> SELECT * from bb;
+----+------------+--------+
| id | mydate     | myroom |
+----+------------+--------+
|  1 | 2022-04-01 |     19 |
|  2 | 2022-04-02 |     19 |
|  3 | 2022-04-03 |     19 |
|  4 | 2022-04-04 |     19 |
|  5 | 2022-04-05 |     19 |
|  6 | 2022-04-06 |     19 |
|  7 | 2022-04-07 |     19 |
+----+------------+--------+
7 rows in set (0.001 sec)

MariaDB [test]>

Aber solange nicht bekannt ist wie die Tabelle oder das Query aussieht kann ich nur raten und die
Glaskugel hat mir das gesagt.

LG Bernd

Gut, die Lösung ist ganz nett, weil sie sich auch (mit dem, was MySQL kann) indizieren läßt (unique auf mydate,myroom).

Gut, daß wir drüber gesprochen haben ;-)
 
Werbung:
Also gegeben ist eine Tabelle mit bereits vorhandenen Buchungen, jeweils ein Datensatz pro Buchung mit Start- und Enddatum. Soll jetzt verhindert werden das eine neue, überlappende Buchung eingetragen werden kann? - Das ginge grundsätzlich immer mit einem Trigger, wenn kein Constraint funktioniert. Oder sollen jetzt Tage ausgegeben werden (in einem Select), die gebucht oder ungegucht sind?

Also was genau brauchst du jetzt? Deine bestehende Tabelle mit Buchungen speichert ja bereits den Zeitraum der Buchung als Information. Die Tage dazwischen ergeben sich aus diesen Daten. Was willst du mehr?

PS: Und jetzt bin ich doppelt verwirrt, weil das selbe Projekt in PostgreSQL beschrieben wird...
 
Zurück
Oben