none
Datum prüfen RRS feed

  • 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

    Dienstag, 4. Juni 2013 09:55

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/

    Mittwoch, 5. Juni 2013 09:16
  • 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-auswerten

    Einen schönen Tag noch,
    Christoph
    --
    Microsoft SQL Server MVP
    http://www.insidesql.org/blogs/cmu/

    Mittwoch, 5. Juni 2013 09:29

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.

    [1] http://weblogs.sqlteam.com/peterl/archive/2008/05/13/Lightning-fast-collapsed-date-ranges-and-missing-date-ranges.aspx

    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
    MSDN Hotline: Schnelle & kompetente Hilfe für Entwickler: kostenfrei!

    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.

    Dienstag, 4. Juni 2013 11:05
  • 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/

    Mittwoch, 5. Juni 2013 09:16
  • 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-auswerten

    Einen schönen Tag noch,
    Christoph
    --
    Microsoft SQL Server MVP
    http://www.insidesql.org/blogs/cmu/

    Mittwoch, 5. Juni 2013 09:29
  • Hallo sqlchewie,

    Hast Du diese Loesungen ausprobiert?

    Gruss,

    Ionut

    Dienstag, 11. Juni 2013 13:42
    Moderator
  • Hallo zusammen.

    Ja, ich habe das Beispiel von Christoph umgesetzt und es funktioniert.

    Vielen Dank für die Hilfe.

    Mittwoch, 12. Juni 2013 07:20