2

我有四个 unix 时间。两个是“今天”的开始和结束(以那一天为准)——即 00:00:00 和 23:59:59——另外两个是用户选择的时间。

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

4

3 回答 3

5

我在一个 txt 文档中有这个要记住(日期阅读障碍):

相交:

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
于 2012-07-23T10:05:34.547 回答
3
where UserStart <= TodayEnd and
      UserEnd >= TodayStart
于 2012-07-23T09:38:10.347 回答
0

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

相交(固定)

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

像这样进行修复可以避免将 Range 1 中的 Range 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

最后是第二个相交

相交(右)

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

根据您的需要,我建议不要使用大于 (>=) 和小于 (<=) '因为您还认为这些组中包含相等的句点,但取决于您

等于范围

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


WHERE Range1Start = Range2Start AND Range1End = Range2End
于 2016-05-07T16:48:01.817 回答