2017-06-01 70 views
1

我有一個SQL查詢的問題。我想顯示可租用汽車列表(未佔用),例如,如果我的汽車從1.06到3.06已租用3天,並且如果顯示可用汽車,我將從datetimepicker1中選擇日期從1.06和datetimepicker2日期到3.06它並沒有告訴我這輛車要借(OK),但是如果我將日期從datetimepicker轉換到4.06或更高,它已經被租借,儘管它被租借到了3.06。如何顯示可用車輛

我的SQL查詢:

string query = @"SELECT C.* FROM Auta C WHERE C.Auto_Id NOT IN (SELECT Auto_Id FROM Rezerwacje R WHERE ((@data1 >= R.DataFrom) AND (@data1 <= R.DataTo) AND (@data2 >= DataFrom) AND (@data2 <= DataTo)))"; 

enter image description here

enter image description here

回答

0

確定:試試這個?

你想挑選DateFrom和DateTo不會「重疊」這個範圍的行。

所以可能是這種情況,開始日期是在該範圍內的某個地方。

@date1 BETWEEN R.DataFrom AND R.DataTo 

它也可以是其中的結束日期是那些範圍

@date2 BETWEEN R.DataFrom AND R.DataTo 

,或者開始之間是前和結束是後

@date1 < R.DataFrom AND @date2 > R.DateTo 

最後一種情況(兩者都是內部是現在只需選擇並排除

SELECT * 
FROM whatever 
WHERE NOT 
    (
    (@date1 BETWEEN R.DataFrom AND R.DataTo) 
    OR 
    (@date2 BETWEEN R.DataFrom AND R.DataTo) 
    OR 
    (@date1 < R.DataFrom AND @date2 > R.DateTo) 
    ) 

簡單的權利?

+0

謝謝你這麼多!你的代碼工作! – Damian

0

我認爲你的問題就是比較的順序。所以你在開始日期(@日期1)和結束日期(@數據2)右的形式獲得的日期範圍

SELECT C.* 
FROM Auta C 
WHERE C.Auto_Id NOT IN 
    (SELECT 
    Auto_Id 
    FROM Rezerwacje R 
    WHERE (R.DataFrom >= @data1 
    and R.DataFrom <= @data2) 
    OR (R.DataTo >= @data1 
    and R.DataTo <= @data2)); 
+0

不是操作員的順序,而是日期 –

+0

在第一個比較中,它要求R.DataFrom小於date1,並且應該更大。 –

+0

好的,但看看我的答案 - 你可以看到他們想要的東西。 – Hogan

0
SELECT C.* FROM Auta C WHERE C.Auto_Id NOT IN 
(SELECT Auto_Id 
FROM Rezerwacje R 
WHERE @data1 <= DataTo AND @data2 >= R.DataFrom) 

回答@Hogan的好點,但它是一個有點複雜,沒有子選擇它是相當誤導反正所以我做了我自己的版本。

+0

如果@ data2在DataFrom和DataTo之間,那麼'@ data2'介於DataTo和DataFrom – Hogan

+0

@Hogan之間時,這將失敗,那麼'@ data2> = R.DataFrom'顯然是真的。作爲@ data1 <= @ data2和@ data2 <= DataTo(它介於兩者之間,請記住?)'@ data1 <= DataTo'也是如此。這些間隔被正確評估爲重疊,並且汽車被排除在結果之外。 –