我想只选择与查询不匹配的数据。
假设我有两个表:
汽车: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-25和2013-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)))