2011-10-25 10 views
1

Id(int)、EventDate(DateTime)、EventStart(datetime)およびEventEnd(datetime)という列のイベントという表があります。1日分のイベントの合計継続時間の計算

すべてのイベントは1日に開始と終了します(つまり、イベントは翌日に終了しません)。ただし、特定の日付のイベントが重複する可能性があります。

任意の数のイベントが特定の日付に発生することがあります。

少なくとも1つのイベントがT-SQLで実行されていた期間の合計を1日計算します。私は与えられた日付のイベントを選択することができ、2つのイベントが重複していればtrueを返し、そうでなければfalseを返す関数を書いています。

しかし、レコードをペアにして関数を実行する方法では、イベントがなくなるまで適切な期間を追加することができません。

お手伝いできますか?

クリス

+1

あなたには、いくつかのサンプルデータと、期待される出力を与えることができますか?私はあなたが求めていることに従うかどうか分からない。 –

答えて

1

はこれを試してみてください:

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

結果:

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

優れた答え。魅力のように最初の回で働いた!ありがとう。 – user1012598

関連する問題