Как исключить ночи из запроса TSQL? - PullRequest
1 голос
/ 04 декабря 2011

Я пишу запрос TSQL, чтобы найти следующую доступную дату и время из списка встреч. До сих пор то, что мне удалось получить, действительно находит пробелы в запросе времени, но я не могу найти отличный способ исключить ночи (скажем, после 7 вечера).

;WITH CTE
AS (  SELECT 
         ID,StartAptDate,EndAptDate, 
         RowNumber = ROW_NUMBER() OVER( ORDER BY StartAptDate ASC )
      FROM Appointments WHERE StylistId = 1 AND StartAptDate > CAST( CONVERT( CHAR(8), GetDate(), 112) AS DATETIME)
   )
   SELECT FirstApptAvail = min( a.EndAptDate )
   FROM CTE a
      INNER JOIN CTE b
         ON a.RowNumber = b.RowNumber - 1
   WHERE datediff( minute, a.EndAptDate, b.StartAptDate) >= 15 AND ...

Небольшой псевдокод для ... будет что-то вроде этого

(a.StartAptDate @ 7pm AND a.StartAptDate> GETDATE + 1 @ 8am )

Часть, которую я не могу понять, состоит в построении правой стороны каждого сравнения. Мне нужно исключить все, что может быть возвращено между 7 вечера в эту ночь - 8 утра на следующее утро.

Заранее спасибо

1 Ответ

1 голос
/ 04 декабря 2011

Спасибо за быструю обратную связь - похоже, я смог получить желаемый результат, используя утверждение BETWEEN, упомянутое в комментариях выше. Сначала я задал начальную и конечную дату в конкретном времени вопроса (то есть часть даты была 1900/01/01, поэтому это не имело значения) Таким образом, я мог использовать ТОЛЬКО время для сравнения с.

;WITH CTE
AS (  SELECT 
         ID,StartAptDate,EndAptDate, 
         RowNumber = ROW_NUMBER() OVER( ORDER BY StartAptDate ASC )
      FROM Appointments WHERE StylistId = 1 AND StartAptDate > CAST( CONVERT( CHAR(8), GetDate() - 5, 112) AS DATETIME)
   )
   SELECT FirstApptAvail = min( a.EndAptDate )
   FROM CTE a
      INNER JOIN CTE b
         ON a.RowNumber = b.RowNumber - 1
   WHERE datediff( minute, a.EndAptDate, b.StartAptDate) >= 15 AND (CAST ( CONVERT( CHAR(8), a.StartAptDate, 108) AS DATETIME) BETWEEN '1900-01-01 07:59:59' AND '1900-01-01 18:59:59' AND CAST ( CONVERT( CHAR(8), a.EndAptDate, 108) AS DATETIME) BETWEEN '1900-01-01 07:59:59' AND '1900-01-01 18:59:59')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...