选择与查询不匹配的数据

时间:2013-04-25 09:49:44

标签: sql date select sql-server-2012

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

说我有两张桌子:

汽车:

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。

2 个答案:

答案 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)))
相关问题