2

我正在研究车辆预订系统,并有两个名为:VehicleBookingStatus 和 VehicleDetails 的表

由于 Vehicle_Id 很常见,它们与主要外来概念相关联。

我的车辆 1(ID)是在 1 月 5 日到 1 月 10 日之间预订的。所以我需要对这两个表进行连接查询,这可以根据可用性给出结果。

例如:车辆不适用于 3 个条件。

  1. 日期为 1 月 3 日至 1 月 7 日
  2. 日期为 1 月 7 日至 1 月 13 日。
  3. 日期为 1 月 3 日至 1 月 15 日。

我已经创建了如下所示的 SP,但它没有给我想要的输出:

Select  
VehicleDetails.Vehicle_Id,
VehicleDetails.Vehicle_Name,
VehicleDetails.Vehicle_Capacity
   from VehicleDetails 
   left join VehicleBookingStatus on  
   VehicleDetails.Vehicle_Id = VehicleBookingStatus.Vehicle_ID
where  
   ((@UserDate NOT between VehicleBookingStatus.Assign_Date and VehicleBookingStatus.Return_Date)
AND
   (@UserEndDate not between VehicleBookingStatus.Assign_Date and VehicleBookingStatus.Return_Date))
OR 
   ((@UserDate not between VehicleBookingStatus.Assign_Date and VehicleBookingStatus.Return_Date)
and (@UserEndDate > VehicleBookingStatus.Return_Date))

@UserDate 和 @UserEndDate 将由用户提供。

谢谢。

4

3 回答 3

1

尝试这个;

Select  v.Vehicle_Id, v.Vehicle_Name, v.Vehicle_Capacity
from VehicleDetails v left join VehicleBookingStatus b 
     on v.Vehicle_Id = b.Vehicle_ID
where b.Assign_Date is null or NOT (
     b.Return_Date between @UserDate and @UserEndDate OR
     b.Assign_Date between @UserDate and @UserEndDate OR 
     (b.Assign_Date < @UserDate AND b.Return_Date > @UserEndDate) )
于 2013-01-30T21:53:16.163 回答
0

我假设您希望查询返回在指定期间可用于预订的车辆的详细信息。

在@UserDate 之前结束或在@UserEndDate 之后开始的预订都没有问题。

因此,车辆不可用的条件是它的预订既在@UserEndDate 之前或之后开始,也在@UserDate 之前或之后结束。

那么查询应该是:

SELECT VD.Vehicle_Id,
       VD.Vehicle_Name,
       VD.Vehicle_Capacity
FROM VehicleDetails VD 
LEFT JOIN VehicleBookingStatus VBS
ON  VD.Vehicle_Id = VBS.Vehicle_ID
AND VBS.Assign_Date <= @UserEndDate
AND VBS.Return_Date >= @UserDate
WHERE VBS.Assign_Date IS NULL

如果新预订可以在前一个预订结束的同一天开始,则=可以移除标志。

于 2013-01-30T22:06:19.400 回答
0

编辑:我修改了我的答案以反映 RBarryYoung 的以下建议:

select 
  vd.Vehicle_Id
, vd.Vehicle_Name
, vd.Vehicle_Capacity
from VehicleDetails vd
left join VehicleBookingStatus vbs on vd.Vehicle_Id = vbs.Vehicle_ID
where NOT (@UserDate <= vbs.Return_Date AND @UserEndDate >= vbs.Assign_Date)
于 2013-01-30T21:17:55.183 回答