Benutzer mit den meisten Antworten
Datum prüfen

Frage
-
Angenommen ich habe ein Autoverleih.
Jetzt wird ein Auto vom
01.03.2012 bis 30.06.2012 an Person1
01.10.2012 bis 31.10.2012 an Person2
12.12.2012 bis 24.12.2012 an Person3
verliehen. Diese Daten stehen in einer Tabelle.Wie bekomme ich es nun hin, das beim select die freie Zeit mit ausgegeben wird.
Z.B. so:
01.01.2012 bis 29.02.2012 LEER
01.03.2012 bis 30.06.2012 Person1
01.07.2012 bis 30.09.2012 LEER
01.10.2012 bis 31.10.2012 Person2
01.11.2012 bis 11.12.2012 LEER
12.12.2012 bis 24.12.2012 Person3
25.12.2012 bis 31.12.2012 LEER
Antworten
-
Hallo! Hier kommt noch ein anderer Ansatz mit CTE und Window Function!
Declare @Autoverleih as Table(Von Date, Bis Date, An Varchar(100), Wagen_ID integer); Insert into @Autoverleih(Von, Bis, An, Wagen_ID) Values ('2012-03-01', '2012-06-30', 'Person1', 1); Insert into @Autoverleih(Von, Bis, An, Wagen_ID) Values ('2012-10-01', '2012-10-31', 'Person2', 1); Insert into @Autoverleih(Von, Bis, An, Wagen_ID) Values ('2012-12-12', '2012-12-24', 'Person3', 1); Insert into @Autoverleih(Von, Bis, An, Wagen_ID) Values ('2012-03-07', '2012-04-30', 'Person3', 2); Insert into @Autoverleih(Von, Bis, An, Wagen_ID) Values ('2012-09-01', '2012-09-30', 'Person1', 2); With NumberedRows as ( Select Von, Bis, An, Wagen_ID, ROW_NUMBER() OVER(PARTITION BY Wagen_ID ORDER BY Von) as rn from @Autoverleih ) Select N1.Wagen_ID, coalesce(DateAdd(DAY, 1, N2.Bis), cast('2012-01-01' as date)) as Von, DateAdd(DAY, -1, N1.Von) as Bis, 'LEER' as An from NumberedRows N1 Left Join NumberedRows N2 on N1.Wagen_ID = N2.Wagen_ID and N1.rn = N2.rn + 1 UNION ALL Select Wagen_ID, Von, Bis, An from @Autoverleih Order by Wagen_ID, Von ;
Einen schönen Tag noch,
Christoph
--
Microsoft SQL Server MVP
http://www.insidesql.org/blogs/cmu/- Als Antwort vorgeschlagen Elmar BoyeEditor Mittwoch, 12. Juni 2013 07:48
- Als Antwort markiert Ionut DumaModerator Donnerstag, 13. Juni 2013 15:26
-
Ich denke, bei beiden Lösungen wird es Problem des Blicks in die Zukunft geben, da hier ja eine Obergrenze definiert werden müsste.
Weiterhin ist zu beachten, dass es auch jahresübergreifenden Verleih geben kann. Du kannst dies sicherlich am besten auswerten, wenn Du Dir eine Kalendertabelle machst und hierüber den Join mit den Ausleihzeiten durchführst. Anschließend musst Du die so aufgebauten Dateninseln wieder zusammen fassen.
Siehe hierzu auch:
http://www.insidesql.org/blogs/cmu/sql_server/dateninseln-erkennen-und-auswertenEinen schönen Tag noch,
Christoph
--
Microsoft SQL Server MVP
http://www.insidesql.org/blogs/cmu/- Als Antwort vorgeschlagen Elmar BoyeEditor Mittwoch, 12. Juni 2013 07:48
- Als Antwort markiert Ionut DumaModerator Donnerstag, 13. Juni 2013 15:26
Alle Antworten
-
Hallo sqlchewie,
unter [1] findest du einen sehr ausführlichen Blogeintrag, der das Thema behandelt und dabei vor allem auf eine performante Lösung eingeht.
Wir hoffen, vielen Besuchern der MSDN Foren durch das Posten dieses Problems und einer möglichen Lösung weiterhelfen zu können.
Viele Grüße,
Thomas Fröhle
App-Entwickler-Hotline für MSDN Online Deutschland
Disclaimer:
Bitte haben Sie Verständnis dafür, dass wir hier auf Rückfragen gar nicht oder nur sehr zeitverzögert antworten können.
Bitte nutzen Sie für Rückfragen oder neue Fragen den telefonischen Weg über die App-Entwickler-Hotline: http://www.msdn-online.de/Hotline
Es gelten für die App-Entwickler-Hotline und dieses Posting diese Nutzungsbedingungen, Hinweise zu MarkenzeichenInformationen zur Datensicherheit sowie die gesonderten Nutzungsbedingungen für die App-Entwickler-Hotline. -
Hallo! Hier kommt noch ein anderer Ansatz mit CTE und Window Function!
Declare @Autoverleih as Table(Von Date, Bis Date, An Varchar(100), Wagen_ID integer); Insert into @Autoverleih(Von, Bis, An, Wagen_ID) Values ('2012-03-01', '2012-06-30', 'Person1', 1); Insert into @Autoverleih(Von, Bis, An, Wagen_ID) Values ('2012-10-01', '2012-10-31', 'Person2', 1); Insert into @Autoverleih(Von, Bis, An, Wagen_ID) Values ('2012-12-12', '2012-12-24', 'Person3', 1); Insert into @Autoverleih(Von, Bis, An, Wagen_ID) Values ('2012-03-07', '2012-04-30', 'Person3', 2); Insert into @Autoverleih(Von, Bis, An, Wagen_ID) Values ('2012-09-01', '2012-09-30', 'Person1', 2); With NumberedRows as ( Select Von, Bis, An, Wagen_ID, ROW_NUMBER() OVER(PARTITION BY Wagen_ID ORDER BY Von) as rn from @Autoverleih ) Select N1.Wagen_ID, coalesce(DateAdd(DAY, 1, N2.Bis), cast('2012-01-01' as date)) as Von, DateAdd(DAY, -1, N1.Von) as Bis, 'LEER' as An from NumberedRows N1 Left Join NumberedRows N2 on N1.Wagen_ID = N2.Wagen_ID and N1.rn = N2.rn + 1 UNION ALL Select Wagen_ID, Von, Bis, An from @Autoverleih Order by Wagen_ID, Von ;
Einen schönen Tag noch,
Christoph
--
Microsoft SQL Server MVP
http://www.insidesql.org/blogs/cmu/- Als Antwort vorgeschlagen Elmar BoyeEditor Mittwoch, 12. Juni 2013 07:48
- Als Antwort markiert Ionut DumaModerator Donnerstag, 13. Juni 2013 15:26
-
Ich denke, bei beiden Lösungen wird es Problem des Blicks in die Zukunft geben, da hier ja eine Obergrenze definiert werden müsste.
Weiterhin ist zu beachten, dass es auch jahresübergreifenden Verleih geben kann. Du kannst dies sicherlich am besten auswerten, wenn Du Dir eine Kalendertabelle machst und hierüber den Join mit den Ausleihzeiten durchführst. Anschließend musst Du die so aufgebauten Dateninseln wieder zusammen fassen.
Siehe hierzu auch:
http://www.insidesql.org/blogs/cmu/sql_server/dateninseln-erkennen-und-auswertenEinen schönen Tag noch,
Christoph
--
Microsoft SQL Server MVP
http://www.insidesql.org/blogs/cmu/- Als Antwort vorgeschlagen Elmar BoyeEditor Mittwoch, 12. Juni 2013 07:48
- Als Antwort markiert Ionut DumaModerator Donnerstag, 13. Juni 2013 15:26