我有四次unix时间。两个是“今天”的开头和结尾(无论哪一天) - 即00:00:00和23:59:59 - 其他两个是用户选择的时间。
我需要的是一个(TSQL友好的)查询来检查“今天”时间之间的时间段是否与用户的时间重叠。有人可以帮忙吗?
答案 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