3

我有下表:

id | start_date  |  end_date  | client_id
1    2013-08-01    2013-08-09       1
2    2013-08-10    2013-08-10       1
3    2013-08-10    2013-08-17       1
4    2013-08-18    2013-08-18       1
5    2013-08-18    2013-08-18       1
6    2013-08-18    2013-08-31       1
7    2013-08-01    2013-08-09       2
8    2013-08-11    2013-08-11       2
9    2013-08-11    2013-08-17       2
10   2013-08-19    2013-08-20       2

我要做的是计算每个客户在场的天数,而不重复每个客户的天数,所以从以前的数据中我希望得到:

client_id | total_days
    1           31
    2           18

因此,对于客户,1我得到 31 是因为他“在场”了 31 天,从 2013 年 8 月 1 日到 2013 年 8 月 31 日没有间隔,而对于客户,2我得到 18 天,因为他在场 18 天:

8/1 - 8/9 = 9 days 
8/11 - 8/17 = 7 days 
8/19 - 8/20 = 2 days

无论如何在MySQL中实现这一点,我已经尝试了一段时间,但不知道如何去做。

这是小提琴

4

2 回答 2

3

如果存在重叠范围,那么我建议构建一个作为日期列表的驱动程序表,然后JOIN使用BETWEEN

SELECT a.Client_ID, COUNT(DISTINCT b.Date)
FROM YourTable a
JOIN Dates b
  ON b.Date BETWEEN a.start_date  AND a.end_date
GROUP BY a.Client_ID

演示:SQL 小提琴

有很多地方可以找到日历表逻辑,这里有一个。

如果范围从不重叠,那么您可以使用SUM(DATEDIFF()).

于 2013-09-11T17:30:51.250 回答
1

如果没有重叠范围。您可以使用以下查询:

SELECT Client_id,
       Sum(DATEDIFF(End_date, Start_date)) AS `Present`
FROM TABLE
GROUP BY Client_id;

这将使您大致了解客户在场的天数。

于 2016-03-25T09:07:59.133 回答