这个问题比看起来更难,因为你的工作经历可能有重叠。事实上,你可以有一个工作时期完全“在”另一个时期,或者在任一端重叠。
您正在寻找的是一个与开始日期有间隔且不在另一个工作期间的 EndDate。因此,让我们使用相关子查询来获取结束日期之后的下一个开始日期,如下所示:
select t.*,
(select StartDate
from t t2
where t2.user_id = t.user_id and
t2.StartDate > t.EndDate
order by StartDate desc
limit 1
) nextStartDate
from t
现在,问题是:这个时期是否被另一个时期所覆盖。为此,我将使用一个复杂的where
子句:
select t.*
from (select t.*,
(select StartDate
from t t2
where t2.user_id = t.user_id and
t2.StartDate > t.EndDate
order by StartDate desc
limit 1
) nextStartDate
from t
) t
where not exists (select 1
from t t2
where t2.StartDate <= t.EndDate and
t2.EndDate >= t.nextStartDate
) and
(t.EndDate is null or t.EndDate > now())
根据您处理重叠的方式,您可能希望在日期之间留出几天的延迟。
这应该会返回表中存在空白的所有记录。在您的示例数据中,这将返回今天的记录(2013-05-19)。“销售”记录之后有一个缺口,直到“营销”职位。“营销”将在未来返回,因为它会在过去结束。
实际上,一个间隙可能会导致返回多条记录。当有重叠时会发生这种情况,我将仅用数字来解释:(0, 10), (5, 12), (15, 20)。从 12/13 开始的差距将影响这两个记录。如果这是一个问题,那么可以修复查询,尽管我首先想到如何修复它会使查询更加复杂。
据推测,您还将过滤用户 ID,您可以将其放在最外面的where
子句中。