2017-04-05 8 views
0

私はBETWEENを使用して2つの日付間のレコードを表示するクエリを持っています。クエリで特定の日付の間にarrival_datedeparture_dateのレコードを表示する必要があります。しかし、クエリは何とかすべてのレコードを表示します。BETWEENクエリが機能しない

列タイプはDATEです。

SELECT DISTINCT art.* FROM accommodation_room_types art 
INNER JOIN accommodation_rooms ar ON art.id = ar.room_type 
INNER JOIN accommodation a ON art.accommodation = a.id 
WHERE a.id = 13 AND NOT EXISTS 
(
    SELECT 1 FROM booked_rooms br INNER JOIN booking b ON br.booking = b.id 
    WHERE br.room = ar.id 
    AND 
    (
     b.arrival_date BETWEEN '2017-12-16' AND '2018-04-16' 
    ) 
    OR 
    (
     b.departure_date BETWEEN '2017-12-16' AND '2018-04-16' 
    ) 
) 

でも私はBETWEEN 'asd' AND 'asd'を書き、それはまだすべてのレコードを表示し、任意のフォーマットエラーを与えるものではありません。 2つの特定の日付間のレコードを表示するためにクエリが間違っていますか?

+1

あなたが必要としているのは、どこの括弧でもありますか? – Ibu

答えて

0

あなたのロジックが正しいか間違っているかわかりませんが、あなたの構文があなたの意図したことをしていません。私がお勧めします:A AND B OR C:それは私を打つ

WHERE a.id = 13 AND 
    NOT EXISTS (SELECT 1 
       FROM booked_rooms br INNER JOIN 
         booking b 
         ON br.booking = b.id 
       WHERE br.room = ar.id AND 
         (b.arrival_date BETWEEN '2017-12-16' AND '2018-04-16' OR 
         b.departure_date BETWEEN '2017-12-16' AND '2018-04-16' 
         )  
       ) 

クエリ内のすべてのその空きスペースがあなたのロジックのように書かれたことを確認することが困難になるということ。あなたの意図(おそらく)はA AND (B OR C)です。

+0

私はあなたに誤りがあります: 'on節'の 'ar.id'列が不明です。 –

+0

@MalenaT。 。 。私はその状態を誤解した。これは単なる相関条件です。あなたはカッコが必要です。 –

-1

*

クエリを書いた方法に代わる1、それは常に条件によらず、1を返します。さらに、それは完全に合法です。

+0

OPは何らかのデータを返すために '1'を返しています。あなたの修正はあなたが思っていることをしていません。 – Ibu

+0

クエリが 'EXISTS'で使用されている場合、どのカラムが返されても問題ありません。' EXISTS'は条件に一致する行があるかどうかをテストするだけです。 – Barmar

+0

あなたはどちらも正しい、私は間違っていた、悪い –