2017-10-08 2 views
1

Supposons que j'ai une table avec les documents suivants: SQL Fiddlemontant Nombre de jours dans horodatages dans le tableau MySQL

| 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 | 

Je veux être en mesure de compter le nombre total de jours distincts par catégorie (entre début et fin). Ainsi: la catégorie a contient les périodes du 26 au 27 septembre et du 6 au 8 octobre (où le 6 octobre apparaît dans plusieurs enregistrements), et la catégorie b n'a que la période du 2 au 3 octobre. Je voudrais donc obtenir le résultat suivant:

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

de quelque déclaration GROUP BY category. Est-ce possible dans (My) SQL?

+0

Si la valeur d'un être 5, 6 non? – Stobor

+0

Je suis désolé, vous avez raison, j'ai fait une erreur en changeant l'exemple – konewka

Répondre

1

Une solution possible consiste à construire une «table de référence» contenant toutes les dates possibles pour votre situation. (Par exemple, vous pouvez remplir cette période de 20 ans dans le futur, et 20 dans le passé.) Pour ce sqlfiddle, je viens de remplir les jours nécessaires. J'ai créé ref_dates avec une seule colonne de date day, et utilisé l'instruction SQL suivante:

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

Si tous se chevauchent (comme dans vos données par exemple), vous pouvez utiliser:

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

S'il y a des lacunes, le problème est beaucoup plus difficile.

+0

Non en effet, les enregistrements ne se chevauchent pas nécessairement, permettez-moi de corriger cela dans mes données exemple – konewka

0

Je voudrais utiliser timestampdiff et utiliser une somme simple. Cela permettrait de calculer la somme des différences en minutes pour que vous puissiez ensuite convertir comme vous le souhaitez.

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

Ce n'est cependant pas exactement comme je le veux, je veux compter le nombre de dates distinctes. Alors imaginez que j'ai deux dossiers «2017-08-10 23: 00» - «2017-08-10 23: 01» et «2017-08-12 11:00 - 2017-08-12 11: 01», je veux ceux-ci comptent pour deux jours, tout comme les deux enregistrements «2017-08-10 01:00 - 2017-08-10 23: 00» et «2017-08-12 02:00 - 2017-08-12 22: 00' – konewka

+0

Dans ce cas, le résultat de la catégorie a ne devrait-il pas être de 5? Etre 26/9, 27/9, 6/10, 7/10 et 8/10 ?? – Adam92