| 

.NET C# Java Javascript Exception

2
Hallo brauche dringend Hilfe für folgendes Problem, bin auch gerne bereit die Hilfe zu bezahlen:
(die 1. Antwort trifft leider das Problem nicht !!)
Also hier nochmal das Problem: Auf einen Parkplatz kommen jeden Tag Autos die einen Parkplatz für verschiedene Zeiträume buchen (DB Feld: Ankunft & Abfahrt = z.B. 03.02.2016 & 21.02.2016). Nun brauche ich eine mySQL Abfrage mit der ich die Anzahl der parkenden Autos für jeden Tag eines frei gewählten Zeitraums (zwei Datumsfelder in der Webpage) abfragen kann. Es wäre toll wenn sich jemand mit mir über schma2410@googlemail.com in Verbindung setzen würde:
1000 Dank im voraus
Matthias
News:
14.10.2016
schma29 11 2
6 Antworten
1
Wenn man in der Abfrage eine untere und eine obere Grenze angeben kann, dann sollte folgende Zeitreihenanalyse die Anzahl bringen:

SELECT COUNT(*) FROM Parkplatz
WHERE Abfahrt BETWEEN <Start> AND <Ende> OR
Ankunft BETWEEN <Start> AND <Ende>


Dies ergibt alle Plätze, die im Zeitraum mindestens kurz belegt waren. <Start> und <Ende> sind die Grenzen des betrachteten Zeitfensters.
Parkplatz enthält mindestens folgende Felder: Ankunft, Abfahrt = Datum/Zeit.

Wenn man die Anzahl der Plätze ermitteln will, die vollständig im Betrachtungszeitraum liegen, dann ist folgende Abfrage notwendig:
SELECT COUNT(*) FROM Parkplatz
WHERE Ankunft BETWEEN <Start> AND <Ende> AND
Abfahrt BETWEEN <Start> AND <Ende>


Wenn man die Anzahl der Parkplätze ermitteln möchte, die während der gesamten Betrachtungszeit belegt waren, dann ist folgende Abfrage notwendig:
SELECT COUNT(*) FROM Parkplatz
WHERE Ankunft <= <Start> AND Abfahrt >= <Ende>

Die Anfragen könnten kombiniert werden, um die Parkplätze zu ermitteln, die belegt waren, aber im Betrachtungszeitraum wieder frei geworden sind.
Vielleicht hilft dies weiter.
17.10.2016
edvservice 1,2k 6
Deine Lösung gefällt mir richtig gut...
damit ist seine Hausarbeit erledigt ;-)
muffi 18.10.2016
Was ich gestern noch vergessen habe:
Wenn die Parkplätze unterschieden werden können (ParkplatzNr), dann kann man COUNT(*) gegen COUNT(DISTINCT ParkplatzNr) ersetzen, um alle unterschiedlichen Parkplätze zu erhalten (falls ein Parkplatz über den Betrachtungszeitraum mehrfach belegt wurde.
edvservice 18.10.2016
0
Wenn ich's richtig verstanden habe, suchst Du sowas hier:

DECLARE @von date, @bis date;

SET @von = CAST('20160801' AS date);
SET @bis = CAST('20160831' AS date);

CREATE TABLE ##parkplatz (
ankunft DATE NOT NULL,
abreise DATE,
kfz VARCHAR(255) NOT NULL
);

-- Testdaten
INSERT INTO ##parkplatz VALUES
( '2016-08-21 09:00', '2016-08-21 13:00', 'KFZ 1' ),
( '2016-08-21 11:00', '2016-08-21 18:00', 'KFZ 2' ),
( '2016-08-21 13:45', '2016-08-21 15:10', 'KFZ 3' ),
( '2016-08-22 09:00', '2016-08-22 13:00', 'KFZ 4' ),
( '2016-08-22 17:00', null, 'KFZ 5');

WITH kalender AS (
SELECT @von AS datum
UNION ALL
SELECT DATEADD(dd, 1, datum)
FROM Kalender
WHERE DATEADD(dd, 1, datum) <= @bis
)
SELECT k.datum, COUNT(p.kfz) AS anzahl_fahrzeuge
FROM kalender k
LEFT OUTER JOIN ##parkplatz p ON k.datum BETWEEN p.ankunft AND ISNULL(p.abreise, @bis)
GROUP BY k.datum
OPTION ( MAXRECURSION 0 );

DROP TABLE ##parkplatz;
14.10.2016
commaender 21 2
Sorry, hab gerade erst gesehen, dass Du die Lösung für MySQL suchst... mein Lösungsvorschlag ist für SQL Server...
commaender 14.10.2016
0
Vielen Dank erst mal für die Antwort. Werde es mit mySQL versuchen. Melde mich dann wieder. Vielen Dank für die schnelle Antwort.

Mit besten Dank
Matthias

Weitere Vorschläge in mySQL sind immer willkommen.
15.10.2016
schma29 11 2
0
Hallo "commaender" habe versuch Dein MSSQL Script in mySQL zu wandeln, jedoch weiß ich nicht wie ich "WITH kalender AS (.." in mySQL einarbeiten soll.
Für eine Idee wäre ich dankbar.
Hier mein Script:

-------- mySQL -------------------------------------

DELIMITER $$

DROP PROCEDURE IF EXISTS `parken`.`parkplatz` $$
CREATE PROCEDURE `parken`.`parkplatz` ()

BEGIN

DECLARE von date;
DECLARE bis date;
SET von = CAST('20160801' AS date);
SET bis = CAST('20160831' AS date);

SELECT von AS datum
UNION ALL

SELECT DATEADD(dd, 1, datum)
FROM Kalender
WHERE (DATEADD(dd, 1, datum) <= bis);
END $$

SELECT k.datum, COUNT(p.kfz) AS anzahl_fahrzeuge
FROM kalender k
LEFT OUTER JOIN parkplatz p ON k.datum BETWEEN p.ankunft AND ISNULL(p.abreise, bis)
GROUP BY k.datum

OPTION ( MAXRECURSION 0 );

DROP TABLE parkplatz;
DELIMITER ;
15.10.2016
schma29 11 2
Soweit mir das bekannt ist, ist WITH mit einer Unterabfrage oder einem View vergleichbar.
muffi 17.10.2016
0
Hallo schma29,
das WITH Statement dass commaender

Verwendet hat wird nicht unterstützt von MySQL (https://stackoverflow.com/questions/1382573/how-do-you-use-the-with-clause-in-mysql).
Es handelt sich dabei um ein Temporäres Ergebnis die ähnlich eine Temp Tabelle verwendet werden kann. Bei MSSQL werden CTE für rekursive abfragen verwendet, ähnlich wie commaenders Abfrage.
Mehr dazu hier (https://technet.microsoft.com/en-us/library/ms190766(v=sql.105).aspx)
Ich habe die Abfrage mit eine While schleife + Temp Tabelle umgeschrieben und hoffe dass es dir weiterhilft.

DECLARE @von date, @bis date;

SET @von = CAST('20160801' AS date);
SET @bis = CAST('20160822' AS date);

CREATE TABLE ##parkplatz (
ParkNr int,
ankunft DATE NOT NULL,
abreise DATE,
kfz VARCHAR(255) NOT NULL
);

-- Testdaten
INSERT INTO ##parkplatz VALUES
( 1,'2016-08-21 09:00', '2016-08-21 13:00', 'KFZ 1' ),
( 2,'2016-08-21 11:00', '2016-08-21 18:00', 'KFZ 2' ),
( 3,'2016-08-21 13:45', '2016-08-21 15:10', 'KFZ 3' ),
( 1,'2016-08-22 09:00', '2016-08-22 13:00', 'KFZ 4' ),
( 4,'2016-08-22 17:00', null, 'KFZ 5'),
( 2,'2016-08-23 17:00', '2016-08-24 17:00', 'KFZ 6');



CREATE TABLE ##Kalender ( datum datetime not null)

declare @dt datetime = @von

While (@dt <= @bis )
begin
insert into ##Kalender
SELECT @dt AS datum

SELECT @dt = DATEADD(dd, 1, @dt)
end

SELECT k.datum, COUNT(p.kfz) AS anzahl_fahrzeuge
FROM ##Kalender as k
LEFT OUTER JOIN ##parkplatz p ON k.datum BETWEEN p.ankunft AND ISNULL(p.abreise, @bis)
GROUP BY k.datum

drop TABLE ##Kalender
DROP TABLE ##parkplatz;
20.10.2016
0
29.10.2016

Stelle deine --Frage jetzt!