2017-09-06 3 views
0

ich eine Reservierung Reservierungssystem zu schaffen, und ich versuche, eine Abfrage zu schreiben, die zu einem bestimmten Zeitpunkt frei, welche Ressourcen zeigt (ermöglicht es Benutzern, welche Stationen buchen zu wählen)Reservierungen SQL-Abfrage

Ich habe zwei Tabellen in meiner Datenbank

Erste Tabelle

 |workstationid | location| 
     +--------------+---------+ 
     |  1  |Downsview| 
     |  2  |Downsview| 
     |  3  |Downsview| 
     |  4  |Downsview| 
     |  5  |Downsview| 

Zweite Tabelle

  |wsid |location |email  |duration |startDate |endDate | 
      +-----+------------+------------+---------+----------+--------+ 
      | 1 | Downsview | randomemail| 5 | 9/4/2017 |9/8/2017| 

Die Abfrage Ich Ausführung bin, ist

  SELECT r.wsid,r.location FROM test_revision2 r WHERE r.location='Downsview' AND not exists(select 1 from test_bookings2 b WHERE r.wsid = b.wsid AND r.location = b.location AND b.startDate > '9/5/2017'AND b.endDate <'9/5/2017') 

jedoch das Problem in der Abfrage ist, dass es alle fünf Standorte als verfügbar kehrt jedoch, wie Sie in meinem zweiten Tabelle sehen kann, gibt es eine Buchung von Sept4th -Sept 8 für Workstation 1.

Anregungen oder Hilfe wäre

workstationid location 
      1   Downsview 
      2   Downsview 
      3   Downsview 
      4   Downsview 
      5   Downsview 
+0

PSA: [ISO-Datumsformat] (https://xkcd.com/1179/). – HABO

+0

Was ist das erwartete Ergebnis für das Datum '9/5/2017'? Arbeitsplatznummern 2,3,4,5? –

+0

Ja, das ist richtig @OtoShavadze – rahulchawla

Antwort

1

Zuerst erkennt, Ihre Tabellen wiederholen Daten? Brauchst du den ersten Tisch?

Zweitens aus nur Ihre zweite Tabelle,

test_bookings2
SELECT 
    r.wsid 
    , r.location 
FROM test_bookings2 r 
WHERE NOT (Startdate <= '2017-09-05' AND EndDate >= '2017-09-05') 

Mit anderen Worten, was Sie versuchen, alle Zeilen zu tun ist, zurück, die für die angegebenen Daten nicht aktiv sind. Um Wirkstoffe an einer beliebigen Stelle in einem bestimmten Zeitraum zu überprüfen, müssen Sie sagen:

WHERE StartDate <= @EndDate AND EndDate >= @StartDate 

, dass alle Buchungen zurückkehren wird, die an einer beliebigen Stelle in der Datums Live sind.

WHERE NOT(StartDate <= @EndDate AND EndDate >= @StartDate) 

NICHT kehrt das Ergebnis so, wenn es wahr zurückgibt, stattdessen ist es ein false.

Dies sollte Ihnen dann alle Zeilen geben, die in Ihrem Datumsbereich nicht aktiv sind.

+0

Warum verwenden Sie nicht die erste Tabelle? Was passiert, wenn in der Tabelle bookings2 für eine bestimmte WorkstationID keine Buchungen vorliegen?Diese Abfrage funktioniert nicht für mich – rahulchawla

+0

die erste Tabelle enthält eine Fremdschlüsselverbindung zu der zweiten, die erste Tabelle verwaltet die Arbeitsstation ID und ihre Position – rahulchawla

+0

Erste Tabelle enthält vorhandene Arbeitsstationen und ihre Position - die zweite Tabelle nur Buchungen (wie ein Buchungshistorie) – rahulchawla

3

Wahrscheinlich müssen Sie etwas wie folgt aus:

select * from first_table 
    where 
    not exists (
     select 1 from Second_table 
     where 
     startDate <= '9/5/2017' and endDate >= '9/5/2017' 
     and 
     wsid = first_table.workstationid 
    ) 

Beachten Sie, dass, wenn Sie zwischen zwei Terminen müssen überprüfen, anstatt nur eine, dann können Sie Datum überprüfen Überlappungen wie folgt aus:

... 
where 
startDate <= 'higher_date_here' and endDate >= 'lower_date_here' 
+0

Dies ist die richtige Antwort, was ich für meine endgültige Lösung führte war, dass das höhere Datum ist das Startdatum – rahulchawla

+0

schnelle Frage @OtoShavadze wenn ich die Abfrage ausführen wähle * aus test_revision2 wobei test_revision2.location = 'Downsview' AND nicht existiert (wähle 1 aus test_bookings2 wo startDate <'11/1/2017 'und endDate> '10/31/2017' und test_bookings2. wsid = test_revision2.wsid) ,, die Ausgabe, die ich bekomme, ist 2,3,4,5, aber es sollte (1..5) sein, weil es keine Buchung an diesem Datum in meinem db gibt, es ist wirklich buggy – rahulchawla

+0

@rahulchawla - Are Sind Sie sicher, dass Sie in dieser Zeitspanne keinen Buchungsort haben? Ich habe gerade hier überprüft: http://rexttester.com/LXI74274 und es funktioniert gut, gibt alle 5 Zeilen von first_table –

0

Problem und Lösung war dieses Datum war Varchar in meiner Datenbank und ich musste eine Besetzung für meine Abfrage

Verwandte Themen