我有四次unix操作。其中两个是"今天"的开始和结束(以当天为准),即00:00:00和23:59:59,另外两个是用户选择的时间。
我需要一个(TSQL友好的)查询来检查"今天"时间之间的时间段是否与用户的时间重叠。有人能帮忙吗?
我在一个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
where UserStart <= TodayEnd and
UserEnd >= TodayStart
我知道这篇文章很旧,但我认为公认的答案是不完整的。大多数情况下,至少还有一个交集情况,并修改以上内容。
区间(固定)
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
最后第二个相交
交叉(右)
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