2015-06-15 7 views
1

Мне было поручено создать базу данных с поддержкой Интернета, где клиенты могут заказывать площадки для кемпинга.SQL-запрос, выбор доступных полей по заданному диапазону дат

В настоящее время я работаю над SQL-запросом, чтобы проверить, какие смолы доступны в течение определенной даты.

У меня есть таблица «Pitch», который содержит pitch и type_id колонны, и «» бронирования таблицы, которые содержат Pitch StartDate и EndDate столбцов. настоящее время у меня это:

SELECT Pitch 
FROM Pitch AS p 
WHERE 
    Pitch NOT IN (
     SELECT Pitch 
     From Booking As b 
     WHERE b.Pitch IS NOT NULL 
      AND b.Pitch = p.pitch 
      AND (StartDate >= 15/06/2015 AND EndDate <= 20/06/2015) 
     ); 
+0

Все, что я вижу здесь это утверждение. Какой у Вас вопрос? –

+0

Я бы хотел, чтобы запрос возвращал только поля, доступные в течение двух дат. –

+0

'15/06/2015' недействительный синтаксис для литерала даты в SQL (на самом деле это число: 15 разделено на 6, разделенное к 2015 году) - какая СУБД принимает это? –

ответ

0

Во-первых, вы должны вынуть «AS» ключевое слово при обращении к таблице. Обычно это используется только для столбцов. Затем не пытайтесь присоединиться к вашему подзапросу. Это может выглядеть примерно так:

SELECT PITCH 
FROM PITCH 
WHERE PITCH NOT IN (
    SELECT PITCH FROM BOOKING 
    WHERE WHERE STARTDATE >= 15/06/2015 --verify syntax of date 
     AND ENDDATE <= 20/06/2015); 

Хотя я бы не рекомендовал именовать столбец так же, как и таблицу.

+0

Brill, это отлично работает, я изменил название коллажей как в таблице, так и в таблице бронирования, также пришлось удалить одну из них из вашего решения, –

+1

О, извините, я не понял, что я дважды набирал WHERE. – Patrick

0

Вы также можете использовать JOIN как этот (возвращать только смол, которые доступны в течение двух дат):

SELECT DISTINCT 
    p.pitch 
FROM 
    Pitch p 
    JOIN 
    Booking b ON p.pitch = b.pitch 
WHERE 
    b.StartDate >= '2015-06-15' 
AND b.EndDate <= '2015-06-20' 

или используя EXISTS так:

SELECT DISTINCT 
    p.pitch 
FROM 
    Pitch p 
WHERE 
    EXISTS( -- or add a `NOT` at first to return only the pitches that are not available during the two dates. 
     SELECT 1 
     FROM Booking b 
     WHERE 
      p.pitch = b.pitch 
     AND b.StartDate >= '2015-06-15' 
     AND b.EndDate <= '2015-06-20' 
Смежные вопросы