MySQL Anzahl der Tage in einem DateRange, innerhalb eines Monats (Buchungstabelle)

Ich versuche, einen Bericht für einen Beherbergungsbetrieb mit den folgenden Informationen zu erstellen:

<code>Number of Bookings (Easy, use the COUNT function)
Revenue Amount (Kind of easy).
Number of Room nights. (Rather Hard it seems)
</code>

Unterteilt in jeden Monat des Jahres.

Einschränkungen - Ich verwende derzeit PHP / MySQL, um diesen Bericht zu erstellen. Ich ziehe die Daten jeweils einen Monat nach dem anderen aus dem Buchungssystem und verwende dann einen ETL-Prozess, um sie in MySQL zu integrieren.
Aus diesem Grund habe ich doppelte Datensätze, wenn eine Buchung über das Monatsende verteilt wird. (z. B. BookingID = 9216 unten - Dies liegt daran, dass wir den Prozentsatz des Umsatzes für Umsatzzwecke in den entsprechenden Monat aufteilen müssen.)

Die Frage.

Wie schreibe ich SQL, das Folgendes bewirkt: Berechnen Sie die Anzahl der gebuchten Übernachtungen in einer Immobilie und gruppieren Sie sie nach Monat. Berücksichtigen Sie, dass, wenn sich eine Buchung über das Ende des Monats erstreckt, die Übernachtungen, die sich innerhalb desselben Monats befinden, als der Check-in auf diesen Monat angerechnet werden, und Übernachtungen, die sich im selben Monat wie der Check-out befinden als kasse.

Zuerst habe ich das benutzt: DATEDIFF (Checkout, Checkin). Dies führte jedoch zu einem Monat mit 48 Übernachtungen in einem Monat mit 31 Tagen. (weil a) 1 Buchung als 11 Nächte gezählt wurde, obwohl sie auf 2 Monate aufgeteilt war, und b) weil sie zweimal erscheint).

Wenn ich dann die Anweisung habe, muss ich sie für das gesamte Jahr wieder in mein CrossTab SQL integrieren.

Einige Ressourcen, die ich gefunden habe, die aber scheinbar nicht funktionieren (MySQL-Abfrage - Datumsbereich innerhalb eines Datumsbereichs & PHP MySQL Double Datumsbereich)

Hier ist ein Beispiel der Tabelle: (Es gibt ~ 100.000 Zeilen mit ähnlichen Daten).

<code>CREATE TABLE IF NOT EXISTS `bookingdata` (
`idBookingData` int(11) NOT NULL AUTO_INCREMENT,
`PropertyID` int(10) NOT NULL,
`Checkin` date DEFAULT NULL,
`Checkout` date DEFAULT NULL,
`Rent` decimal(10,2) DEFAULT NULL,
`BookingID` int(11) DEFAULT NULL,
PRIMARY KEY (`idBookingData`),
UNIQUE KEY `idBookingData_UNIQUE` (`idBookingData`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=10472 ;

INSERT INTO `bookingdata` (`idBookingData`, `PropertyID`, `Checkin`, `Checkout`, `Rent`, `BookingID`) VALUES
(5148, 2, '2011-07-02', '2011-07-05', 1105.00, 10612),
(5149, 2, '2011-07-05', '2011-07-13', 2155.00, 10184),
(5151, 2, '2011-07-14', '2011-07-17', 1105.00, 11102),
(5153, 2, '2011-07-22', '2011-07-24', 930.00, 14256),
(5154, 2, '2011-07-24', '2011-08-04', 1832.73, 9216),
(5907, 2, '2011-07-24', '2011-08-04', 687.27, 9216),
(5910, 2, '2011-08-11', '2011-08-14', 1140.00, 13633),
(5911, 2, '2011-08-15', '2011-08-16', 380.00, 17770),
(5915, 2, '2011-08-25', '2011-08-29', 1350.00, 17719),
(5916, 2, '2011-08-30', '2011-09-01', 740.00, 16813);
</code>

Antworten auf die Frage(1)

Ihre Antwort auf die Frage