Reputation: 397
Hope someone can help me with a script to identify resource utilisation per hour. The screenshot shows the 3 scenarios
I am struggling to come with a query when time overlap
Sample data
CREATE TABLE #temptable ( [resourceid] uniqueidentifier, [VirtualWorkerName] nvarchar(128), [startdatetime] datetime, [enddatetime] datetime, [sessionnumber] int )
INSERT INTO #temptable ([resourceid], [VirtualWorkerName], [startdatetime], [enddatetime], [sessionnumber])
VALUES
( '{f69f653e-d301-44ec-a081-7df6e3b02113}', N'DR0001:8183', N'2018-11-01T09:00:00.003', N'2018-11-01T09:25:00.003', 3 ),
( '{0bf414c3-da13-4379-97a1-395f6638b946}', N'DR0001', N'2018-11-01T09:00:00.003', N'2018-11-01T09:25:00.003', 24 ),
( '{0bf414c3-da13-4379-97a1-395f6638b946}', N'DR0001', N'2018-11-01T09:00:00.003', N'2018-11-01T09:25:00.003', 15 ),
( '{0bf414c3-da13-4379-97a1-395f6638b946}', N'DR0001', N'2018-11-01T09:00:00.003', N'2018-11-01T09:25:00.003', 19 ),
( '{0bf414c3-da13-4379-97a1-395f6638b946}', N'DR0001', N'2018-11-01T09:00:00.003', N'2018-11-01T09:25:00.003', 12 ),
( '{a77efccf-26b2-49cb-b0d4-a721328e19c8}', N'DR0001:8193', N'2018-11-01T09:00:00.003', N'2018-11-01T09:25:00.003', 56 ),
( '{f69f653e-d301-44ec-a081-7df6e3b02113}', N'DR0001:8183', N'2018-11-01T09:35:00.003', N'2018-11-01T09:40:00.003', 21 ),
( '{a77efccf-26b2-49cb-b0d4-a721328e19c8}', N'DR0001:8193', N'2018-11-01T09:40:00.003', N'2018-11-01T10:10:00.003', 88 ),
( '{f69f653e-d301-44ec-a081-7df6e3b02113}', N'DR0001:8183', N'2018-11-01T09:50:00.003', N'2018-11-01T10:10:00.003', 17 ),
( '{f69f653e-d301-44ec-a081-7df6e3b02113}', N'DR0001:8183', N'2018-11-01T10:00:00.003', N'2018-11-01T10:05:00.003', 76 ),
( '{0bf414c3-da13-4379-97a1-395f6638b946}', N'DR0001', N'2018-11-01T10:00:00.003', N'2018-11-01T10:10:00.003', 64 ),
( '{0bf414c3-da13-4379-97a1-395f6638b946}', N'DR0001', N'2018-11-01T10:05:00.003', N'2018-11-01T10:10:00.003', 44 ),
( '{f69f653e-d301-44ec-a081-7df6e3b02113}', N'DR0001:8183', N'2018-11-01T11:42:43.843', N'2018-11-01T12:00:49.643', 144 ),
( '{f69f653e-d301-44ec-a081-7df6e3b02113}', N'DR0001:8183', N'2018-11-01T12:17:30.943', N'2018-11-01T14:05:03.88', 831 ),
( '{f69f653e-d301-44ec-a081-7df6e3b02113}', N'DR0001:8183', N'2018-11-01T14:21:30.3', N'2018-11-01T14:35:59.457', 26 ),
( '{f69f653e-d301-44ec-a081-7df6e3b02113}', N'DR0001:8183', N'2018-11-01T14:42:44.037', N'2018-11-01T14:58:20.653', 36 ),
( '{f69f653e-d301-44ec-a081-7df6e3b02113}', N'DR0001:8183', N'2018-11-01T15:05:16.753', N'2018-11-01T15:21:24.337', 46 ),
( '{f69f653e-d301-44ec-a081-7df6e3b02113}', N'DR0001:8183', N'2018-11-01T15:40:50.7', N'2018-11-01T15:58:59.11', 66 ),
( '{f69f653e-d301-44ec-a081-7df6e3b02113}', N'DR0001:8183', N'2018-11-01T15:48:42.353', N'2018-11-01T17:28:42.387', 30228 )
http://sqlfiddle.com/#!18/a3dfb4
Upvotes: 1
Views: 52
Reputation: 344
here is the hour cut to use with your above script. looks a bit complex with inner select queries, but in fact the simple trick is to slice distinct 5 minutes periods :
declare @T TABLE([resourceid] uniqueidentifier, [dt1] datetime, [dt2] datetime)
INSERT @T ([resourceid], dt1, dt2)
select distinct resourceid, dt1,dt2
from #temptable a
outer apply(select [dt1] = cast(convert(char(16), startdatetime,126)+':00' as datetime) /*second truncate*/
,[dt2] = cast(convert(char(16), enddatetime,126) +':00' as datetime)
)dt
order by resourceid, dt1,dt2;
select resourceid, [Time] = periodeH, [usage (minutes)] = SUM(diff)
from(
select distinct resourceid,periodeH,periode1,periode2,diff
from(
select *,[diff]=DATEDIFF(MINUTE
,case when dt1 < periode1 then periode1 else dt1 end
,case when dt2 > periode2 then periode2 else dt2 end
)
from @T
-- hour slice --
join (values(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),(13),(14),(15),(16),(17),(18),(19),(20),(21),(22),(23)
)hours(hh) on hh between datepart(HOUR,dt1) and datepart(HOUR,dt2)
-- 5 minutes slice --
join (values(0),(5),(10),(15),(20),(25),(30),(35),(40),(45),(50),(55)
)minutes(mm) on cast(convert(char(11),dt1,126)+RIGHT('0'+cast(hh as varchar),2)+':'+RIGHT('0'+cast(mm as varchar),2)+':00' as datetime) between cast(convert(char(15),dt1,126)+'0:00' as datetime) and cast(convert(char(16),dt2,126)+':00' as datetime)
outer apply(select
[periodeH] = convert(char(11), dt1 ,126)+RIGHT('0'+cast(hh as varchar),2)+':00:00'
,[periode1] = cast(convert(char(11), dt1,126)+RIGHT('0'+cast(hh as varchar),2)+':'+RIGHT('0'+cast(mm as varchar),2)+':00' as datetime)
,[periode2] = dateadd(minute,5,cast(convert(char(11), dt1 ,126)+RIGHT('0'+cast(hh as varchar),2)+':'+RIGHT('0'+cast(mm as varchar),2)+':00' as datetime))
)periode
)a
where diff>0
)a group by resourceid,periodeH
order by 1,2
Upvotes: 1