这是一个经典问题,如果您逆转逻辑,实际上会更容易。
让我举一个例子。
我将在此处发布一个时间段,以及其他时间段的所有不同变体以某种方式重叠。
|-------------------| 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 endends 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 periodsWHERe NOT (range_start > @check_period_endOR range_end < @check_period_start)
请注意其中的 NOT 。由于这两个简单的规则找到了所有 不匹配的 行,因此简单的NOT会将其反转为:
如果它不是不匹配的行之一,则必须是匹配的行之一 。
在此处应用简单的逆逻辑来消除NOT,您将得到:
SELECt *FROM periodsWHERe range_start <= @check_period_end AND range_end >= @check_period_start



