Как исключить определенную c строку из SQL счетчика - PullRequest
1 голос
/ 06 августа 2020

Мне нужно исключить определенную строку из COUNT на SQL сервере. Вот что у меня есть:

SELECT COUNT(GuestId)TotalBooked
FROM GuestStayDetails
WHERE (@ArrivalDate = ArrivalDate)
   OR (@DepartureDate = DepartureDate) 
   OR (@ArrivalDate < ArrivalDate AND @DepartureDate = DepartureDate) 
   OR (@ArrivalDate = ArrivalDate AND @DepartureDate < DepartureDate)
   OR (@ArrivalDate < ArrivalDate AND @DepartureDate > DepartureDate)
   OR (@ArrivalDate < DepartureDate AND @DepartureDate > DepartureDate)
   OR (@ArrivalDate BETWEEN ArrivalDate AND DATEADD(Day, -1, DepartureDate))
   OR (@DepartureDate BETWEEN DATEADD(Day, -1, ArrivalDate) AND DepartureDate)
  AND Student = 1
  AND Cancelled = 0
  AND GuestStayDetails.GuestId != @GuestId;

Если я удалю последний AND GuestStayDetails.GuestId != @GuestId;, он даст мне ожидаемый COUNT, однако я должен исключить один из GuestID s. Есть предложения?

Ответы [ 2 ]

1 голос
/ 06 августа 2020

Похоже, вам нужно добавить скобки вокруг условий -ИЛИ-. Можете ли вы протестировать это и сообщить нам, работает ли оно? Обратите внимание на открывающую и закрывающую круглые скобки вокруг предложений -OR-.

SELECT COUNT(GuestId)TotalBooked
FROM GuestStayDetails
WHERE (
        (@ArrivalDate = ArrivalDate)
     OR (@DepartureDate = DepartureDate) 
     OR (@ArrivalDate < ArrivalDate AND @DepartureDate = DepartureDate) 
     OR (@ArrivalDate = ArrivalDate AND @DepartureDate < DepartureDate)
     OR (@ArrivalDate < ArrivalDate AND @DepartureDate > DepartureDate)
     OR (@ArrivalDate < DepartureDate AND @DepartureDate > DepartureDate)
     OR (@ArrivalDate BETWEEN ArrivalDate AND DATEADD(Day, -1, DepartureDate))
     OR (@DepartureDate BETWEEN DATEADD(Day, -1, ArrivalDate)AND DepartureDate) 
  )
  AND Student = 1
  AND Cancelled = 0
  AND GuestStayDetails.GuestId != @GuestId; 
0 голосов
/ 06 августа 2020

Похоже, вы ищете перекрывающиеся временные интервалы - а также проблему со скобками. В этом случае вы можете значительно упростить запрос:

WHERE @ArrivalDate <= DepartureDate AND
      @DepartureDate >= ArrivalDate AND
      Student = 1 AND
      Cancelled = 0 AND
      GuestStayDetails.GuestId <> @GuestId

Это избавляет от необходимости использовать круглые скобки вообще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...