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

Rentals 中的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 年 4 月 25 日和 2013 年 5 月 30 日之间的时间段,所有汽车都会出现,即使其中一些在该时间段之间已被预订。

我使用 MS SQL 2012。

4

2 回答 2

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)))
于 2013-04-25T10:08:17.380 回答
0

您需要反过来比较日期:

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

此外, usingNOT 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)
于 2013-04-25T10:01:50.847 回答