이것은 고전적인 문제이며 논리를 반대로하면 실제로 더 쉽습니다.
예를 들어 보겠습니다.
여기에 한 기간을 게시하고 어떤 식 으로든 겹치는 다른 기간의 모든 변형을 게시하겠습니다.
|-------------------| compare to this one
|---------| contained within
|----------| contained within, equal start
|-----------| contained within, equal end
|-------------------| contained within, equal start+end
|------------| not fully contained, overlaps start
|---------------| not fully contained, overlaps end
|-------------------------| overlaps start, bigger
|-----------------------| overlaps end, bigger
|------------------------------| overlaps entire period
반면에 겹치지 않는 모든 항목을 게시하겠습니다.
|-------------------| compare to this one
|---| ends before
|---| starts after
따라서 간단하게 비교를 다음과 같이 줄이십시오.
starts after end
ends before start
그런 다음 겹치지 않는 모든 항목을 찾은 다음 일치하지 않는 모든 기간을 찾습니다.
마지막 NOT IN LIST 예의 경우 두 규칙과 일치 함을 알 수 있습니다.
다음 기간이 범위 안 또는 밖인지 결정해야합니다.
|-------------|
|-------| equal end with start of comparison period
|-----| equal start with end of comparison period
테이블에 range_end 및 range_start라는 열이있는 경우 일치하는 모든 행을 검색하는 몇 가지 간단한 SQL이 있습니다.
SELECT *
FROM periods
WHERE NOT (range_start > @check_period_end
OR range_end < @check_period_start)
거기에 NOT 에 유의하십시오 . 두 개의 간단한 규칙이 일치하지 않는 모든 행을 찾기 때문에 간단한 NOT은 다음과 같이 반전합니다. 일치하지 않는 행 중 하나가 아닌 경우 일치하는 행 중 하나 여야합니다 .
NOT을 제거하기 위해 여기에 간단한 반전 논리를 적용하면 다음과 같이 끝납니다.
SELECT *
FROM periods
WHERE range_start <= @check_period_end
AND range_end >= @check_period_start