2011-10-25 4 views
1

Nous avons une table appelée Events, avec les colonnes Id (int), EventDate (DateTime), EventStart (datetime) et EventEnd (datetime). Tous les événements commencent et se terminent un seul jour (c'est-à-dire qu'aucun événement ne se termine le jour suivant), mais les événements d'une date donnée peuvent se chevaucher (l'un d'entre eux pouvant en recouvrir un autre entièrement).Calcul de la durée totale des événements d'un jour

Un nombre quelconque d'événements peut se produire pour une date donnée.

Je voudrais, pour un seul jour, calculer la durée totale pendant laquelle au moins un événement était en cours en T-SQL. Je peux sélectionner les événements à une date donnée, et j'ai même écrit une fonction retournant true si deux événements se chevauchent et false sinon.

Je suis cependant coincé sur la façon de prendre les enregistrements par paires et de les passer dans ma fonction, en ajoutant les durées de manière appropriée jusqu'à ce que je manque d'événements.

Pouvez-vous m'aider?

Chris

+1

pouvez-vous donner quelques exemples de données et certains résultats attendus? Je ne suis pas sûr de suivre ce que vous demandez. –

Répondre

1

Essayez ceci:

--test table 
declare @t table(fromt datetime, tot datetime) 
--test data 
insert @t values('2011-01-01 10:00', '2011-01-01 11:00') 
insert @t values('2011-01-01 10:00', '2011-01-01 10:05') 
insert @t values('2011-01-01 10:30', '2011-01-01 11:30') 
insert @t values('2011-01-01 12:00', '2011-01-01 12:30') 
insert @t values('2011-01-02 12:00', '2011-01-02 12:30') 

--query 
;with f as 
(
    select distinct fromt from @t t 
    where not exists(select 1 from @t where t.fromt > fromt and t.fromt < tot) 
), t as 
(
    select distinct tot from @t t 
    where not exists(select 1 from @t where t.tot >= fromt and t.tot < tot) 
), s as 
(
    select datediff(day, 0, fromt) d, datediff(second, fromt, (select min(tot) 
     from t where f.fromt < tot and datediff(day, f.fromt, tot) = 0)) sec 
    from f 
) 
select dateadd(day, 0, d) day, sum(sec)/60 [minutes] 
from s 
group by d 
order by d 

Résultat:

day      minutes 
----------------------- ------- 
2011-01-01 00:00:00.000 120 
2011-01-02 00:00:00.000 30 
+0

Excellente réponse. A travaillé la première fois comme un charme! Merci. – user1012598

Questions connexes