如何在用户特定日期之间进行搜索?

时间:2013-01-30 20:26:43

标签: sql date stored-procedures

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

它们与通常的Vehicle_Id的主要外国概念相关联。

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

例如:车辆不适用于3种情况。

  1. 日期是3月1日至7月
  2. 日期是7月7日至13日。
  3. 日期是3月1日至15日。
  4. 我创建了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将由用户提供。

    感谢。

3 个答案:

答案 0 :(得分: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) )

答案 1 :(得分: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)

答案 2 :(得分: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

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