2013-04-25 70 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