這個問題比看起來更難,因爲你可以在工作經歷中有重疊。事實上,你可以完全在另一個「內部」工作一段時間,或者在任何一端重疊工作。
你在找的是一個與開始日期有差距的結束日期和不在另一個就業期間。所以,讓我們用一個相關子查詢的結束日期之後獲得下一個開始日期,如:
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開始的差距將影響兩個記錄。如果這是一個問題,那麼查詢可以修復,但我首先想到如何解決這個問題會使查詢更加複雜。
大概你也會過濾用戶標識,你可以把它放在最外層的where
子句中。
看起來像一個硬編碼的解決方案1案? – Drew
我以爲Dave只要求用戶在下班6個月後就被標記。我會在一秒鐘之內提交我的帖子。 –
你最好這是可怕的! jk – Drew