2017-10-08 63 views
1

假設我有以下記錄的表:SQL Fiddle計數量,

| category |    begin |     end | 
|----------|---------------------|---------------------| 
|  a | 2017-09-26 08:00:00 | 2017-09-27 10:00:00 | 
|  b | 2017-10-02 13:00:00 | 2017-10-03 07:00:00 | 
|  a | 2017-10-06 02:00:00 | 2017-10-06 09:00:00 | 
|  a | 2017-10-06 11:00:00 | 2017-10-06 14:00:00 | 
|  a | 2017-10-06 19:00:00 | 2017-10-08 10:00:00 | 

我希望能夠計算的每個類別不同天的總量(以間開始,結束)。因此:類別a包含10月26日至27日和10月6日至8日(10月6日出現在多個記錄中)的時間段,而類別b只有10月2日至3日的時間段。我想因此得到以下結果:

| category | days | 
|----------|------| 
|  a | 5 | 
|  b | 2 | 

從一些GROUP BY category聲明。 (My)SQL中可能嗎?

+0

應爲a的值是5,而不是6? – Stobor

+0

對不起,你是對的,我在修改例子時犯了一個錯誤 – konewka

回答

1

一個可能的解決方案涉及構建一個包含所有情況的所有可能日期的「參考表」。 (例如,你可以在未來20年,過去20年。)對於這個sqlfiddle,我剛剛填補了必要的日子。我創建ref_dates與單個日期列day,並用於以下SQL:

select category, 
count(distinct day) 
from times 
inner join ref_dates 
    on cast(begin as date) <= day 
    and day <= cast(end as date) 
group by category; 
0

如果他們都重疊(如在您的示例數據),你可以使用:

select category, datediff(min(begin), max(end)) 
from t 
group by category; 

如果有差距,這個問題是非常困難。

+0

沒有的確,記錄不一定重疊,讓我在我的示例數據中修復這個 – konewka

0

我會使用timestampdiff並利用一個簡單的總和。這將計算分鐘差異的總和,然後按需要進行轉換。

select category, 
sum(timestampdiff(minute, begin,end)) as 'diff' 
from times 
group by category 
+0

然而這並不完全如我所願,我想統計不同日期的數量。所以想象我有兩條記錄:2017-08-10 23:00' - '2017-08-10 23:01'和'2017-08-12 11:00 - 2017-08-12 11:01',我想要這些計爲兩天,就像兩個記錄「2017-08-10 01:00 - 2017-08-10 23:00」和「2017-08-12 02:00 - 2017-08-12 22: 00' – konewka

+0

在這種情況下,類別a的結果不應該是5嗎?是26/9,27/9,6/10,7/10和8/10 ?? – Adam92