2017-02-11 108 views
0

我有一个表有多个列两列是起始日期日期和结束日期。汇总计算天数各月在SQL

我需要计算每个月的天数。假设我有以下数据在我的表

id | start_date | end_date  
1 04.01.2016 15.02.2016  
2 07.01.2016 22.01.2016  
3 16.05.2016 11.07.2016 

我想要的输出如下

Month | numberOfTravelDays  
January  51  
February 15  
May   15 
June  31  
July  11 

此输出我期待的是总旅行天数每月已经使用的数量。我无法为此构建sql查询。有人可以帮助我吗?

这是我现在。并没有完成这项工作。下面的查询也只过滤今年的记录(但忽略)。

select MONTH(start_date) as month, 
    COUNT(DATEDIFF(start_date, end_date)) as numberOfTravelDays 
from travel 
where YEAR(start_date) = YEAR(CURDATE()) 
group by MONTH(start_date), 
    MONTH(end_date) 
+0

为什么这些领域不是实际日期时间 'YYYY-MM-DD'? – Parfait

+0

是的,他们是实际日期时间,虽然它不是在我的示例数据明显 – DesirePRG

+0

有一个编辑按钮 – Strawberry

回答

0

使用派生表:

select monstart, 
     sum(datediff(least(m.monend, t.end_date) + interval 1 day, 
        greatest(m.monstart, t.start_date) 
        ) 
      ) as days_worked 
from travel t join 
    (select date('2016-01-01') as monstart, date('2016-01-31') as monend union all 
     select date('2016-02-01') as monstart, date('2016-02-29') as monend union all 
     . . . 
    ) m 
    on t.end_date >= m.monstart and t.start_date <= m.monend 
group by monstart; 
+0

非常感谢你的帮忙。我会试试这个,并且拿回 – DesirePRG

+0

你已经硬编码了monstart和monend。我必须将年份作为参数传递给此查询。在这种情况下,这不会工作正确 – DesirePRG

+0

@DesirePRG。 。 。只需扩展派生表,将所有您关心的年份(或更好,但是这些都放在真正的表格中),并使用'where'子句选择您想要的年份。 –