我想只选择与查询不匹配的数据。
说我有两张桌子:
汽车:
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 之间的时段,则所有车辆都会显示,即使其中一些车辆在此期间预订。
我使用的是MS SQL 2012。
答案 0 :(得分:0)
您需要以相反的方式比较日期:
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)
答案 1 :(得分:0)
将所有日期转换为日期时间格式,时间为0(即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)))