首页 > 解决方案 > 查找给定期间的所有条目,而条目可以在一天之前或之后开始,但对于正在进行的条目,entry-end 可能为空

问题描述

我有一张表,里面有很多我想查询的条目。我想显示与某个时间跨度重叠的条目。

通常我会用

entry.start <= timespan.end AND entry.end >= timespan.start

所以我会找到并显示所有边缘情况:

             |------- time span to query -----|
   |--------------|                 
                                     |----------|
 |-------------------------------------------------|
                      |-----------|
not a result:
x------X 

但是数据模型还指定条目的结束时间可能是null:条目正在进行中......

所以:

              |------- time span to query -----|
       |--------------------------------------------------------
                   |-------------------------------------------- 
  
The follwing should not be in the result:
                                                     x----------

我正在努力如何编写正确的查询来解决端点的空值...

标签: mysqldatabase

解决方案


这是常见的范围重叠。一般规则 - 期间开始少于相反的期间结束。如果某个边框可能为空,这意味着“无限”,则此类边框将替换为其相反的边框(如果两个开始或两端都不能为空)或整个表格MIN(start)MAX(end)整个表格。

在您的情况下(检查的时间跨度范围始终设置两个边界)条件可能是

WHERE COALESCE(entry.start, timespan.start) <= timespan.end
  AND COALESCE(entry.end, timespan.end) >= timespan.start

如果不得返回相邻(但不重叠)的范围,则分别替换<=and >=with <and >


推荐阅读