我有四个 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
像这样进行修复可以避免将 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