Как найти конфликт временных интервалов в SQL-запросе

Я хочу найти конфликт времени, но это не дает мне правильного результата для записей ниже. Я хочу вернуть конфликт true для временного интервала - «t1.starttime to t2.endtime», поскольку этот временной интервал конфликтует с «t2.starttime и t2.endtime», потому что время с 7 по 12 охватывало время с 8 до 11.30.

t1.StartTime     t1.EndTime       t2.StartTime     t2.EndTime
---------------- ---------------- ---------------- ----------------
07:00:00.0000000 12:00:00.0000000 08:00:00.0000000 11:30:00.0000000

я выполняю запрос ниже, но он не дает мне результата.

SELECT 
  count(1) 
FROM 
  t1 INNER JOIN t2 ON

  CAST(t1.StartTime as TIME)  
  BETWEEN CAST(t2.StartTime as TIME) 
  AND CAST(t2.EndTime as TIME) OR CAST(t1.EndTime as TIME)  
  BETWEEN CAST(t2.StartTime as TIME) 
  AND CAST(t2.EndTime as TIME)

person dsi    schedule 10.01.2014    source источник
comment
Вы искали: [tsql] или [sql-server] или [sql-server-2008] или [sql-server-2008-r2] или [sql-server-2005] перекрывающийся диапазон   -  person HABO    schedule 10.01.2014
comment
Если вы на самом деле попытаетесь следовать своему собственному запросу, вы заметите, что 7 не находится между 8 и 11:30, а 12 — ни тем, ни другим. Так что конечно ваше условие не выполнено. Смотрите ответ Гордона для правильной логики. Что обычно помогает, так это взять лист бумаги и попытаться нарисовать свою проблему с периодами времени в виде перекрывающихся линий. Нарисуйте все возможные перекрытия и посмотрите, какую логическую связь вы можете найти между началом и концом каждой строки в каждом случае.   -  person oerkelens    schedule 10.01.2014
comment
Вероятно, вам следует прочитать это статья.   -  person Zane    schedule 10.01.2014


Ответы (1)


Правильная логика для перекрытия немного проще:

SELECT count(1) 
FROM t1 INNER JOIN
     t2
     ON CAST(t1.StartTime as TIME) < CAST(t2.EndTime as TIME) and
        CAST(t1.EndTime as TIME) > CAST(t2.StartTime as TIME);

Логика такова, что один интервал начинается до окончания другого и заканчивается после начала другого.

person Gordon Linoff    schedule 10.01.2014
comment
+1 за логику, конечно, но также и за то, что элегантное использование условия соединения не изменилось на where, как это произошло в предыдущем вопросе OP :) - person oerkelens; 10.01.2014