比较多个条目的日期

时间:2015-04-13 13:30:30

标签: mysql date compare

我正在创建一个小型租车系统,我想要一个存储过程,该过程需要一个日期并检查哪些车可用。我已经进行了比较工作,但是如果一辆车有多个合同而且其中一个合同不是输入日期,而另一个是合同说它是可用的。以下是我到目前为止的程序

delimiter //

create procedure allAvailableVehicles(req varchar(15))    
BEGIN

select distinct vehicles.vehicleID as "Vehicle ID", vehicles.Make as "Make", vehicles.Model as "Model" from vehicles

left outer join contracts
on vehicles.vehicleID=contracts.vehicleID
where cast(req as date) not between hiredFrom and hiredUntill
or contractID is unknown
order by vehicles.vehicleID;

end
//    
delimiter ;

1 个答案:

答案 0 :(得分:0)

这是使用not exists的好机会:

select v.*
from vehicles v
where not exists (select 1
                  from contracts c
                  where c.VehicleId = v.VehicleId and
                        cast(req as date) between hiredFrom and hiredUntil
                 );

注意:您不需要将req转换为日期,因为它应该已经存储为数据库中的日期(除非req还有时间组件)。

编写存储过程的更好方法是:

delimiter //

create procedure allAvailableVehicles(p_req date)
begin
  select v.*
  from vehicles v
  where not exists (select 1
                    from contracts c
                    where c.VehicleId = v.VehicleId and
                          p_req between hiredFrom and hiredUntil
                   );
  end //

  delimiter ;

使用内置类型的日期/时间。另外,命名参数以将它们与列区分开来。