2017-09-06 4 views
0

Je crée un système de réservation de réservation et je suis en train d'écrire une requête qui montre quelles ressources sont libres à un moment donné (permet aux utilisateurs de choisir les stations réservation)Réservations requête SQL

J'ai deux tables dans ma base de données

table Première

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

table Deuxième

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

La requête J'exécute est

  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') 

Cependant, le problème de la requête est qu'il retourne tous les 5 endroits aussi disponibles mais comme vous pouvez le voir dans mon deuxième table il y a une réservation de Sept4th -sept 8 pour poste de travail 1.

OU SUGGESTIONS AIDE SERAIT apprécié

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

PSA: [format de date ISO] (https://xkcd.com/1179/). – HABO

+0

Quel est le résultat attendu pour la date '9/5/2017'? workstationids 2,3,4,5? –

+0

Oui, c'est correct @OtoShavadze – rahulchawla

Répondre

1

Tout d'abord, vos tableaux répéter les données? Avez-vous besoin de la première table?

Deuxièmement, à partir juste en utilisant votre deuxième table, test_bookings2

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

En d'autres termes, ce que vous essayez de faire est de retourner toutes les lignes qui ne sont pas actifs pour vos dates données. Pour vérifier actifs à tout moment dans une plage de dates, vous devez dire:

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

qui renverra toutes les réservations qui sont en direct à tout moment dans votre plage de dates.

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

PAS le résultat renverse alors quand il retourne vrai, au lieu de son faux.

Ceci devrait alors vous donner toutes les lignes qui ne sont pas actives dans votre plage de dates.

+0

Pourquoi n'utilisez-vous pas la première table? Que faire s'il n'y a pas de réservations pour un certain workstationID dans la table bookings2?cette requête ne fonctionne pas pour moi – rahulchawla

+0

la première table contient une connexion de clé étrangère à la seconde, la première table gère l'ID de poste de travail et leur emplacement – rahulchawla

+0

La première table contient les postes de travail existants et leur emplacement - la deuxième table ne contient que des réservations (comme une Historique des réservations) – rahulchawla

3

Probablement vous avez besoin quelque chose comme ceci:

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 
    ) 

Notez que si vous avez besoin de vérifier entre deux dates au lieu d'un seul, alors vous pouvez vérifier la date chevauche comme ceci:

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

Ceci est la réponse correcte ce que je cherchais qui a conduit à ma solution finale était que la date la plus élevée est la date de début – rahulchawla

+0

@OtoShavadze lorsque j'exécute la requête sélectionnez * from test_revision2 où test_revision2.location = 'Downsview' AND n'existe pas (sélectionnez 1 dans test_bookings2 où startDate <'11/1/2017 'et endDate> '10/31/2017' et test_bookings2. wsid = test_revision2.wsid) ,, la sortie que je reçois est 2,3,4,5, mais il devrait être (1..5) parce qu'il n'y a pas de réservation à cette date dans mon db c'est vraiment bogué – rahulchawla

+0

@rahulchawla - Are vous êtes sûr de ne pas avoir de lieu de réservation sur cet intervalle de temps? Je viens de vérifier ici: http://rextester.com/LXI74274 et cela fonctionne bien, donne toutes les 5 lignes de first_table –

0

problème et la solution était cette date était varchar dans ma base de données et je devais utiliser un cast sur ma requête