选择不匹配查询的数据



我想只选择与查询不匹配的数据。

假设我有两个表:

汽车:

id         int          PRIMARY KEY IDENTITY
make       varchar(255) NOT NULL
model      varchar(255) NOT NULL
pricegroup varchar(1)   NOT NULL

租赁:

id         int          PRIMARY KEY IDENTITY
sdate      date         NOT NULL
edate      date         NOT NULL
car_id     int          NOT NULL

sdate为租期开始日期,edate为租期结束日期。

我要查找指定时间段内所有可用的汽车。

这个查询几乎可以工作:

SELECT * FROM cars WHERE id NOT IN 
  (SELECT car_id FROM rentals WHERE sdate <='2013-04-28' AND edate >='2013-04-30')

然而,它只适用于特定的日期。如果你输入一个在2013-04-252013-05-30之间的时间段,所有的车都会出现,即使其中一些车在这段时间内被预订了。

你需要反过来比较日期:

SELECT * FROM cars WHERE id NOT IN 
  (SELECT car_id FROM rentals WHERE sdate <='2013-04-30' AND edate >='2013-04-28')

同样,使用NOT EXISTS可能比NOT IN提供更好的性能:

SELECT * FROM cars WHERE NOT EXISTS
  (SELECT 1 FROM rentals WHERE car_id=cars.id AND edate>=start_date AND sdate<=end_date)

将所有日期转换为时间为0的datetime格式(即2013-04-28 00:00:00.000)。

SELECT * FROM cars WHERE id NOT IN
(SELECT car_id FROM rentals WHERE 
    Convert(datetime, Convert(varchar(12),sdate,106)) as sdate >= Convert(datetime, Convert(varchar(12),'2013-04-28',106)) AND 
    Convert(datetime, Convert(varchar(12),edate,106)) as edate <= Convert(datetime, Convert(varchar(12),'2013-04-30',106)))

最新更新