如何显示可用的汽车

时间:2017-06-01 01:39:43

标签: c# sql

我的SQL查询有问题。我想显示可供租车的车辆列表(未占用),例如,如果我的车已经从1.06租用了3天到3.06,如果显示可用的车我将从datetimepicker1日期从1.06和datetimepicker2日期选择到3.06它没有显示我要借这辆车(好),但是如果我把日期从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

3 个答案:

答案 0 :(得分:0)

我认为你的问题只是比较的顺序。试试这个:

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

答案 1 :(得分:0)

好的,你可以得到开始日期(@ date1)和结束日期(@ data2)形式的日期范围吧?

您想要选择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)
   )

简单吧?

答案 2 :(得分: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的答案有一个很好的观点,但它有点复杂,没有副选择它反正是误导,所以我做了我自己的版本。