2013-04-25 39 views
0

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

说我有两个表:

汽车:

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所有车辆都会出现,即使其中一些车辆在此期间预订。

我使用MS SQL 2012

回答

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) 
+0

看起来像你的'不存在',因为它应该 – 2013-04-25 10:06:16

0

将时间格式转换为日期时间格式为0(即2013-04-28 00:00:00)

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))) 
+0

为什么这将是必要的? – 2013-04-25 10:09:29

+1

如果你有这样的日期,即2013-04-28 12:39:12.000。你不能得到这个日期,如果你使用这样的查询**其中sdate = 2013-04-28 **。我面对这样的问题,所以我总是转换为这种格式** 2013-04-28 00:00:00:00 ** – 2013-04-25 10:20:29

+0

那么,插入我的数据库中的日期只是日期,根本就没有时间,所以不应该成为一个问题在这里。 – 2013-04-25 10:22:16