2017-02-11 154 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'子句選擇您想要的年份。 –