0

クエリに一致しないデータのみを選択したい。

2 つのテーブルがあるとします。

車:

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

日付を逆に比較する必要があります。

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)
于 2013-04-25T10:01:50.847 に答える
0

すべての日付を、時間を 0 として datetime 形式に変換します (つまり、 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 に答える