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