计算和总和日期范围内的天数

时间:2013-09-11 17:22:38

标签: mysql sql

我有下表:

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

2 个答案:

答案 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;

这将为您提供客户在场的天数概览。