SQL Server, временные интервалы

#sql

#sql

Вопрос:

У меня возникли проблемы с запросом к моей базе данных.. У меня есть таблица :

 **Room**
  ---------------------------------- 
 |RoomNo---RoomStatusID---RoomTypeID|
 |  1   ---     1      ---    1     |
 |  2   ---     1      ---    1     |
  ---------------------------------- 

**ClientRoom**
  -------------------------------------------------------------------- 
 |ClientRoomNo---RoomNo--------ArrivalDate-------------DepartureDate  |
 |  1         ---  1   ---- 2011-10-03 1:00:00 ---- 2011-10-03 4:00:00|
 |  2         ---  1   ---- 2011-10-03 5:00:00 ---- 2011-10-03 8:00:00|
  -------------------------------------------------------------------- 
  

Если я использую этот запрос =

 SELECT Room.RoomNo, RoomType.RoomType
FROM Room INNER JOIN
RoomType ON Room.RoomTypeNo = RoomType.RoomTypeNo
FULL OUTER JOIN ClientRoom ON Room.RoomNo = ClientRoom.RoomNo
WHERE
(((ClientRoom.ArrivalDate <= '10-03-2011 1:00:00' AND
ClientRoom.ArrivalDate <= '10-03-2011 5:00:00') AND
(ClientRoom.DepartureDate <= '10-03-2011 1:00:00' AND
ClientRoom.DepartureDate <= '10-03-2011 5:00:00'))
OR Room.RoomStatusId  = 1)
  

Он вернется

 **ClientRoom**
      -------------------------------------------------------------------- 
     |ClientRoomNo---RoomNo--------ArrivalDate-------------DepartureDate  |
     |  2         ---  1   ---- 2011-10-03 5:00:00 ---- 2011-10-03 8:00:00|
      -------------------------------------------------------------------- 
  

Потому что он доходил до 5:00 утра.
Но когда я меняю время прибытия и отъезда на .. 5:00 — 8:00..
Номер 1 все еще находится в результатах.
Я уже пробовал НЕ МЕЖДУ 🙁

Комментарии:

1. Что находится в таблице RoomType? Почему вы используете ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ? Это гарантирует, что все строки из обеих таблиц (LHS и RHS FOJ) будут отображаться в выходных данных, даже если совпадений нет.

2. RoomType содержит тип комнаты, это не имеет значения для запроса. Я использую FOJ для объединения всех доступных комнат в комнате и клиентской комнате

3. @TheOxblood — в нынешнем виде у вас есть два избыточных предложения where . Все операторы есть <= , вы можете удалить <=.. 1:00:00 alltogether .

4. Извините, я новичок здесь в stackoverflow 🙂

5. Я хочу получить все доступные номера. Я не хочу извлекать номера, УКАЗАННЫЕ во время моего прибытия и отъезда

Ответ №1:

Вы не объяснили, какой результат вы хотите получить при каких обстоятельствах. Но это условие

 ClientRoom.ArrivalDate <= '10-03-2011 1:00:00' AND 
ClientRoom.ArrivalDate <= '10-03-2011 5:00:00'
  

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

     ClientRoom.ArrivalDate <= '10-03-2011 5:00:00'
  

То же самое для следующей части:

 ClientRoom.DepartureDate <= '10-03-2011 1:00:00' AND
ClientRoom.DepartureDate <= '10-03-2011 5:00:00'
  

Это то же самое, что просто сказать:

 ClientRoom.DepartureDate <= '10-03-2011 5:00:00'
  

Редактировать: из комментариев, которые я прочитал, следует, что у вас есть заданный временной интервал (a, d) и вы хотите проверить для каждой строки, совпадает ли ваш временной интервал с временным интервалом строки (A, D). Вы хотите видеть только неперекрывающиеся строки.

Это означает, что ваше WHERE предложение должно быть похоже на этот квазикод:

 WHERE d <= A -- my departure will be before the rows arrival
   OR a >= D -- my arrival is behind the rows departure
  

В полных терминах:

 WHERE (    '10-03-2011 5:00:00' <= ClientRoom.ArrivalDate 
        OR '10-03-2011 1:00:00' >=  ClientRoom.DepartureDate 
      )
    OR Room.RoomStatusId = 1
  

Правка 2:

Что делает запрос с этим исправлением? «Покажите мне все строки расписания, которые не конфликтуют с моим расписанием». Но запрос должен быть «Покажите мне комнаты, в которых нет конфликтов с моим расписанием». Это совершенно другой зверь, но его легко перевести на SQL:

 SELECT 
    Room.RoomNo
FROM Room
WHERE NOT EXISTS (
    SELECT 1 
    FROM ClientRoom
    WHERE 
       Room.RoomNo = ClientRoom.RoomNo
       AND (   '10-03-2011 5:00:00' <= ClientRoom.ArrivalDate 
            OR '10-03-2011 1:00:00' >=  ClientRoom.DepartureDate 
           )
)
OR Room.RoomStatusId  = 1
  

Комментарии:

1. Я также использую NOT BETWEEN, но те же результаты. Я хочу получить все доступные номера. Я не хочу извлекать номера, УКАЗАННЫЕ во время моего прибытия и отъезда

2. @TheOxblood — вы приняли этот ответ как правильный, но, судя по вашим комментариям, похоже, что это не решает вашу проблему. Какой это?

3. Я хочу получить все доступные номера. Я не хочу извлекать номера, УКАЗАННЫЕ во время моего прибытия и отъезда

4. В каких терминах? Синтаксическая ошибка? Неправильные результаты? Вы использовали точную версию, которая видна сейчас ?

5. @TheOxblood, пожалуйста, подумайте над этим вопросом также на мета-уровне: просматривая разговоры — почему потребовалось так много времени, чтобы получить ответ? Должен ли я предоставить более конкретные примеры или описание? И так далее. Это очень поможет вам в следующем вопросе.