2016-08-09 34 views
0

我正在嘗試爲我正在處理的項目創建SQL語句。它應該返回所有尺寸合適的車輛vehicleId,並且該租賃表格當天尚未安排在該日期。確保沒有重疊

架構

Vehicles(vehicleId, size) 
Rental(rentId, customerId, vehicleId, startdate, enddate, cost) 

SELECT vehicles.vehicleId 
FROM vehicles 
WHERE vehicles.size= "van" 
AND vehicles.vehicleId <> 
(SELECT rental.vehicleId 
FROM rental 
WHERE (rental.startdate BETWEEN '2016-04-27' AND '2016-04-30') 
OR (rental.enddate BETWEEN '2016-04-27' AND '2016-04-30')) 

語句的第一部分之前,AND(涉及2個表),則返回所有大小貨車和第二部分中的vehicleid,之後的AND,應該刪除任何通過檢查開始日期或結束日期是否重疊來計劃在時間範圍內的vehicleid。但是第二部分不是那樣工作的,當運行整個事情時什麼都不會返回。

聲明有什麼問題。

回答

1

你的問題可能出在原始查詢報價和使用<>而不是NOT IN。但是,更重要的是,重疊的邏輯是錯誤的。我想你想:

SELECT v.vehicleId 
FROM vehicles v 
WHERE v.size = 'van' AND 
     v.vehicleId NOT IN (SELECT r.vehicleId 
          FROM rental r 
          WHERE r.startdate <= '2016-04-30' AND 
           r.enddate >= '2016-04-27' 
         ); 

作爲一個簡單的例子,從「2016年4月1日」到「2016年5月1日」租金不會正確地被你的邏輯標記。

重疊時間段的正確邏輯是一個週期在另一個結束之前開始並且第一個結束在另一個開始之後開始。

1

你沒有註明您的日期,所以他們沒有日期 - 他們的數學表達式:

rental.enddate BETWEEN 2016-04-27 AND 2016-04-30 

執行,如果它是 「2016減4減27」:

rental.enddate BETWEEN 1985 AND 1982 

他們都應該被引用:

rental.enddate BETWEEN '2016-04-27' AND '2016-04-30' 
+0

在引號中加入了引號,但語句仍然沒有返回任何內容。 (上面編輯以反映變化) –

+0

如果子查詢可以返回多行數據,那麼您也可能希望'not in'而不是'<>'。 –

+0

不是我所需要的。謝謝我一直堅持這個比我想要承認的更長的時間。 –