2014-01-10 25 views
1

我有一張如下所示的表。實際上有50,000個用戶,每個用戶的技術範圍無限。有關於日期的間隙沒有限制,啓動,結束,重疊等查找併發日期範圍中的空白 - MySQL

User  From   To 
A  2011-01-03  2013-04-09 
A  2012-04-16  2012-03-08 
A  2012-12-11  2013-06-17 
A  2013-07-17 
A  2013-09-22  2013-12-24 
B  2011-04-06  2013-01-02 
B  2012-02-12  2012-02-14 
B  2012-11-10  2013-03-16 
B  2013-04-16 
B  2013-04-22  

我需要計算在2013未包括這些範圍對於每個用戶的工作日數。 「到」日期的空白表示範圍正在進行。

在它上面的例子是2013年6月18日和2013年7月16日之間平日用戶A的號碼,以及用於B.

2013年3月17日2013年4月15日和之間

我有一個單獨的平日查找表,但我對日期範圍使用最小和最大值做的任何事情都會給我一個從2013-01-01到2013-12-31的「固定」日期範圍。

我不明亮....

謝謝。

+0

考慮提供適當的DDL和/或sqlfiddle連同所需的結果集 – Strawberry

+0

嗨 - 對不起,什麼是DDL? sqlfiddle不會在我的工作中運行。我可以運行其他人的解決方案,但不能編輯myown。可能是由於IE8。 –

回答

1
SELECT users.User, COUNT(*) 

FROM  users 
      CROSS JOIN weekdays 
      LEFT JOIN userDates ON 
         userDates.User = users.User 
        AND userDates.From <= weekdays.date 
        AND (userDates.To IS NULL OR userDates.To >= weekdays.date) 

WHERE weekdays.date >= '2013-01-01' 
    AND weekdays.date < '2014-01-01' 
    AND userDates.User IS NULL 

GROUP BY users.User 
+0

謝謝 - 我可以alomost圍繞我的大腦。你是否假設了第三個名爲'users'的用戶名錶?我可以問爲什麼我需要'和userDates.User IS NULL'? –

+1

@DazedandConfused:是的,這是正確的;如果這樣的表不存在,可以在上面的'FROM'和'users'之間放置'(SELECT DISTINCT User FROM userDates)'。過濾'userDates.User IS NULL'只留下'userDates'中沒有*匹配的'weekday'記錄:參見[SQL連接的可視化解釋](http://www.codinghorror.com/博客/ 2007/10/A-視覺解釋-的-SQL joins.html)。 – eggyal