Проверьте, совпадают ли даты с датами в той же таблице - PullRequest
0 голосов
/ 02 октября 2018

В таблице ниже показаны 3 выбранные строки из таблицы сеансов, которые содержат 3 сеанса для одного и того же врача в один и тот же день, но с разным временем начала и окончания.Я хочу обновить столбцы sessionStartTime и sessionEndTime одной строки в этой таблице, проверяя, перекрывают ли эти sessionStartTime и sessionEndTime другие 2 строки.Мне нужен правильный SQL-запрос для этого.

Например, я хочу отредактировать sessionStartTime как 2018-07-08 9:30:00 и sessionEndTime как 2018-07-08 10:30:00 строки с id = 1091 и как начальныйвремя и время окончания этого сеанса не перекрываются с двумя другими значениями строки, эти два значения должны быть обновлены. Но если я ввел два значения sessionStartTime как 2018-07-08 8:20:00 и sessionEndTime как 2018-07-089:00:00 с идентификатором = 1091 не должно позволять редактировать строку, поскольку уже существует другой сеанс с идентификатором = 1090, который содержит начальную и конечную длительность.

enter image description here

это запрос, который я уже пробовал.

SELECT * 
FROM session 
WHERE (sessionDate='2018-07-08 00:00:00') 
  AND (userInfoId=420) 
  AND (   ('2018-07-08 9:30:00'BETWEEN sessionStartTime AND sessionEndTime) 
       OR ('2018-07-08 10:30:00'BETWEEN sessionStartTime AND sessionEndTime )
       OR (sessionStartTime BETWEEN '2018-07-08 9:30:00' AND '2018-07-08 10:30:00'));

1 Ответ

0 голосов
/ 02 октября 2018

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

DECLARE @d1 AS DATETIME = '2018-07-08 09:30:00'
DECLARE @d2 AS DATETIME = '2018-07-08 10:30:00'
SELECT *
FROM session
WHERE userInfoId = 420 -- really?
AND id <> 1091 -- a row always overlaps with itself
AND @d2 > sessionStartTime AND sessionEndTime > @d1 -- overlap test, exclusive end date

Если этот запрос возвращает одинЧем больше строк, тем больше совпадений, иначе нет.Замените @d1 и @d2 литералами даты и времени, параметрами или переменными.

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