Проверьте это: DateTimeOverlaps
В целом, если все переменные имеют временные значения, допускающие значение NULL, то
return (StartA.HasValue? StartA.Value:DateTime.Minimum) <=
(EndB.HasValue? EndB.Value:DateTime.Maximum) &&
(EndA.HasValue? EndA.Value:DateTime.Maximum) >=
(StartB.HasValue? StartB.Value:DateTime.Minimum);
Концепция (как объяснено в ссылке) очень проста и представляет собой просто и кратко , изложенные выше.
Если начало предшествует концу других, а конец - после другого начала, у вас есть совпадение. Это говорит обо всем и обо всем, что необходимо, в одном простом предложении с двумя предложениями, и любой код, который вы пишете, должен кратко соответствовать этой простой концепции, не запутывая ее. Добавление дополнительной ненужной сложности не добавляет понимания, оно только добавляет длины.
Сбой Случай 1: TopStart ПОСЛЕ другого завершения - Сбой
|----------|
|--|
Сбой Случай 2: TopEnd ПОСЛЕ другого запуска - Сбой
|-----------|
|------|
Во всех других случаях начало предшествует другому концу, а конец - после другого начала.
кейс A
|----------|
|-----|
корпус B
| ---------|
|-------------------|
кейс C
|-----------|
|------|
кейс D
|-----------|
|-------------|