我有下表:
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中实现这一点,我已经尝试了一段时间,但不知道如何做到这一点。
这是fiddle
答案 0 :(得分: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 Fiddle
有很多地方可以找到日历表逻辑,here's one.
如果范围从不重叠,则可以使用SUM(DATEDIFF())
。
答案 1 :(得分:1)
如果没有重叠范围。您可以使用以下查询:
SELECT Client_id,
Sum(DATEDIFF(End_date, Start_date)) AS `Present`
FROM TABLE
GROUP BY Client_id;
这将为您提供客户在场的天数概览。