Announcement

Collapse
No announcement yet.

SQL-SELECT über Zeitbereich

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • SQL-SELECT über Zeitbereich

    Hallo Leute,

    ich habe ein Problem bei einem SQL Select, wo ich am verzweifeln bin

    Autos können über einen Auftrag von einem Startzeitpunkt bis zu einem Endzeitpunkt reserviert werden.

    Um einen Auftrag anlegen zu können, muss ich vorher wissen welcher Wagen frei ist. Ich will daher alle freie Wagen einer bestimmten Kategorie selektieren, für die "kein" Auftrag im übergebenen Zeitbereich vorliegt.

    Im Anhang sind die 3 Tabellen zum besseren Verständnis.

    Es ist ein Auftrag für den Wagen mit der ID=1 und der Category ID = 1 vorhanden, der als Starttermin den 22.3 und als Endtermin den 28.3 hat.

    Wenn ich jetzt meinen Select mit Startdatum = 23.3 und Endedatum = 29.3 eingebe, bekomme ich alle Wagen außer den mit der ID = 1. Was ja auch richtig ist. Ändere ich das Startdatum im Select z. b. auf den 24.3 und das Enddatum auf den 27.3 wird auch der Wagen mit der ID = 1 ausgegeben - was ja falsch ist, weil der Wagen zu dem Zeitpunkt reserviert ist. Die Bedingung greift nicht. Wie lautet es richtig und was ist falsch an dem Statement? Oder stimmt mein Modell nicht und der Select ist damit garnicht möglich? Ich hab schon einige Sachen ausprobiert, aber immer das gleiche Problem.

    Nachfolgend ist mein Statement gegeben:

    Code:
     DECLARE @start VARCHAR(50)
     DECLARE @end VARCHAR(50)
     
     SET @start = '24.03.2010 23:59:59'
     SET @end = '26.03.2010 23:59:59'
    
    SELECT Car.ID, Car.CarNumber
    FROM Car
    INNER JOIN Category ON Car.CategoryID = Category.ID
    WHERE Car.ID NOT IN
    -- Selektiere alle Aufträge in der übergebenen Zeitspanne
    (SELECT [Order].CarID FROM [Order]
     WHERE ([Order].StartDate BETWEEN CONVERT(DATETIME, @start, 104) AND
     CONVERT(datetime, @end, 104))
     OR ([Order].EndDate BETWEEN CONVERT(DATETIME, @start, 104) AND
     CONVERT(datetime, @end, 104))
    )
    AND Category.ID = 1
    Danke im Voraus für Eure Hilfe!
    Attached Files

  • #2
    Hi,
    die korrekte Überprüfung von Start- und Enddatum für den beschriebenen Fall sieht wie folgt aus:
    Code:
    SELECT Car.ID, Car.CarNumber
    FROM Car
    INNER JOIN Category ON Car.CategoryID = Category.ID
    WHERE Car.ID NOT IN
    -- Selektiere alle Aufträge in der übergebenen Zeitspanne
    (SELECT [Order].CarID FROM [Order]
     WHERE ([Order].StartDate < CONVERT(datetime, @end, 104)) AND
     ([Order].EndDate > CONVERT(DATETIME, @start, 104))
    )
    AND Category.ID = 1
    (ungetestet)

    Comment


    • #3
      Danke!

      Vielen Dank für Deine Hilfe, es scheint zu funktionieren! Ich hätte gleich Fragen sollen, hätte mir sehr viel Zeit erspart.

      Ich hatte es so ähnlich beim ersten Versuch. Allerdings hatte ich die Parameter vertauscht, dass größer/kleiner Zeichen und größer-/kleiner-gleich statt größer/kleiner.

      Comment


      • #4
        größer-/kleiner-gleich statt größer/kleiner.
        Ja das mit dem "gleich" ist bei Datumsvergleichen etwas schwierig, wenn man zB auf kompletten Tagen operiert, da man immer noch die Uhrzeit bei hat. Falls du auf ganzen Tagen operierst, dann würde zB die Abfrage auf Anfangsdatum = Enddatum = 22.3 (also Autoausleihe für diesen einen Tag) uU. wieder das Auto mit der ID=1 liefern, was ja eigentlich nicht passieren darf. Je nach Anforderung muss man beim Vergleich der Datumswerte entsprechend noch einen Tag abziehen/addieren, ein einfaches größer-/kleiner-gleich hilft da meist nicht weiter.

        Comment

        Working...
        X