SQL mental block - 检查一段时间是否与另一段时间重叠

时间:2012-07-23 08:56:35

标签: sql tsql

我有四次unix时间。两个是“今天”的开头和结尾(无论哪一天) - 即00:00:00和23:59:59 - 其他两个是用户选择的时间。

我需要的是一个(TSQL友好的)查询来检查“今天”时间之间的时间段是否与用户的时间重叠。有人可以帮忙吗?

3 个答案:

答案 0 :(得分:5)

我有一个要记住的txt doc(日期阅读障碍):

<强>区域相交:

Date Range 1   |         |>----------------------<|
Date Range 2   |                 |>------------------------<|

where Range1Start <= Range2End and Range1End >= Range2Start

范围2中的范围1:

Date Range 1   |                   |>-------------<|
Date Range 2   |                 |>------------------------<|


where Range1Start >= Range2Start and Range1End <= Range2End

范围1中的范围2:

Date Range 1   |         |>----------------------<|
Date Range 2   |                 |>-------------<|


where Range2Start >= Range1Start and Range2End <= Range1End

答案 1 :(得分:2)

where UserStart <= TodayEnd and
      UserEnd >= TodayStart

答案 2 :(得分:0)

我知道这篇文章已经过时了,但我认为接受的答案是不完整的。大多数情况下至少还有一个相交案例并修改上述内容。

INTERSECT(FIXED)

Date Range 1   |         |>----------------------<|
Date Range 2   |                 |>------------------------<|
WHERE Range1Start <= Range2Start AND Range1End <= Range2End AND Range1End>=Range2Start

这样的修复允许避免将范围1中的范围2检测为交点(这是接受的解决方案中的查询结果)

接下来的两个都可以,但没有很好地说明

范围2中的范围1

Date Range 1   |                      |>-------------<|
Date Range 2   |                 |>------------------------<|

Date Range 1   |                 |>------------------------<|
Date Range 2   |                 |>------------------------<|

WHERE Range1Start >= Range2Start AND Range1End <= Range2End 

范围1中的范围2:

Date Range 1   |         |>------------------------<|
Date Range 2   |               |>-------------<|

Date Range 1   |         |>------------------------<|
Date Range 2   |         |>------------------------<|


WHERE Range2Start >= Range1Start AND Range2End <= Range1End

最后第二次交叉

INTERSECT(RIGHT)

Date Range 1   |                |>----------------------<|
Date Range 2   |       |>------------------------<|
WHERE Range2Start <= Range1Start AND Range2End <= Range1End AND Range1Start <=Range2End

根据您的需要,我建议不要使用大于(&gt; =)和小于(&lt; =)&#39;因为您还假设等于句点在这些组中但由您决定

平等范围

Date Range 1   |         |>------------------------<|
Date Range 2   |         |>------------------------<|


WHERE Range1Start = Range2Start AND Range1End = Range2End