2017-06-01 65 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'也是如此。这些间隔被正确评估为重叠,并且汽车被排除在结果之外。 –