1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
|
--Test data
WITH t_tmp(id, StartTime, EndTime) AS
(SELECT 1, '20120124 09:00:00', '20120124 12:00:00' UNION
SELECT 2, '20120125 12:00:00', '20120125 19:00:00' UNION
SELECT 3, '20120125 16:30:00', '20120125 20:00:00' UNION
SELECT 5, '20120125 11:00:00', '20120125 12:00:00' UNION
SELECT 7, '20120125 11:00:00', '20120125 11:30:00' UNION
SELECT 8, '20120125 11:00:00', '20120125 11:30:00' UNION
SELECT 3, '20120125 16:30:00', '20120125 20:00:00' UNION
SELECT 4, '20120126 16:00:00', '20120126 18:00:00'
)
,OrderedEnds AS (
SELECT cast(a.StartTime as DATE) PerDay, -- Par jour
a.StartTime,
a.EndTime,
ROW_NUMBER() OVER(PARTITION BY cast(a.StartTime as DATE) ORDER BY cast(a.StartTime as DATE), a.EndTime desc) AS rn
FROM t_tmp a
)
,StartAndEnds AS (
SELECT a.PerDay,
a.StartTime,
a.EndTime,
a.rn
FROM OrderedEnds a
WHERE a.rn=1
UNION ALL
SELECT cast(b.StartTime as DATE) PerDay,
case when b.StartTime < c.StartTime then b.StartTime
else c.StartTime end as StartTime,
case when b.EndTime < c.StartTime then b.EndTime
else c.StartTime end as EndTime,
b.rn
FROM OrderedEnds b
join StartAndEnds c
on b.PerDay = c.PerDay
and b.rn = c.rn + 1
)
select SUM(datediff(minute,starttime,EndTime)) from StartAndEnds
group by PerDay |
Partager