Нам нужно было бы проверить наложение значений datetime из строк, с начальной и конечной датой timetime
визуально, учитывая начало и конец, для которого мы хотим проверить перекрытие, есть несколько возможностей:
start end
| |
s--e | | no overlap
s----e | overlap (*)
s--------e | overlap
s---------------e overlap
s------------------e overlap
s---e | overlap
s----------e overlap
s-------------e overlap
| s---e | overlap
| s-------e overlap
| s----------e overlap
| s----e overlap (*)
| | s---e no overlap
, чтобы найти строки, которые не перекрываются (при условии, что start_date_time всегда предшествует end_date_time, и оба не равны NULL), мы могли бы использовать такой тест:
WHERE r.end_date_time < '2019-03-21 00:00'
OR r.start_date_time >= '2019-03-22 00:00'
Если«конец» в строке равен перед началом диапазона, который мы хотим проверить, перекрытия нет.Или, если «начало» в строке равно на или после конца диапазона, перекрытия нет.
Это проверка на любое перекрытие в любое время 3/21/ 2019.(«начало» равно 3/21, а «конец» равно 3/22.)
Обращение этого условия даст нам строки, которые do перекрываются:
WHERE NOT ( r.end_date_time < '2019-03-21 00:00'
OR r.start_date_time >= '2019-03-22 00:00'
)
Что можно переписать:
WHERE r.end_date_time >= '2019-03-21 00:00'
AND r.start_date_time < '2019-03-22 00:00'
(Обратите внимание, что нам нужно более сложное условие, если значения start_date_time и / или end_date_time могут быть равны NULL, или если end_date_time может быть раньше start_date_time.)