There is a smart way to do this, unfortunately, I'm not that smart.JimDECLARE @Table Table (AgentID int , [State] varchar(10),StartTime datetime , EndTime datetime, Duration int)INSERT INTO @TableSELECT 1234,'NotReady','04-05-2011 08:00:00','04-05-2011 08:00:05', 5 UNION SELECT 1234,'Ready','04-05-2011 08:00:05','04-05-2011 08:01:00', 55 UNION SELECT 1234,'Busy','04-05-2011 08:01:00','04-05-2011 08:03:00', 120 UNION SELECT 1234,'ACW','04-05-2011 08:03:00','04-05-2011 08:03:10', 10 UNION SELECT 1234,'Ready','04-05-2011 08:03:10','04-05-2011 08:05:00', 110 UNION SELECT 1234,'NotReady','04-05-2011 08:05:00','4-05-2011 08:35:00', 1800 UNION SELECT 1234,'NotReady','04-05-2011 08:40:00','4-05-2011 09:10:00', 1800 UNION SELECT 1234,'Ready','04-05-2011 08:35:00','04-05-2011 08:40:00', 300;with cteas(select * ,[NewDuration] = CASE WHEN datepart(minute,StartTime)/30 = datepart(minute,EndTime)/30 THEN Datediff(second,starttime,endtime) ELSE CASE WHEN datepart(minute,StartTime)/30 < datepart(minute,EndTime)/30 THEN Datediff(second,starttime,DATEADD(minute,30,DATEADD(hour,datediff(hour,0,starttime),0))) ELSE Datediff(second,starttime,DATEADD(hour,1,DATEADD(hour,datediff(hour,0,starttime),0))) END END , [InterVal] =DATEADD(minute,((datediff(minute,0,StartTime )) /30 )*30 ,0) from @table),cte2 as(select agentid,[state],starttime,endtime,duration,[newduration] ,[interval] = convert(varchar(10),interval,108)from cteunionselect agentid,[state],starttime,endtime,duration ,[duration] - [newduration] ,convert(varchar(10),dateadd(minute,30,interval),108)from ctewhere [duration] <> [newduration])SELECT agentID ,Interval ,isnull(Ready,0) as ReadyTime ,isnull(NotReady,0) as NotReadyTime ,isnull(ACW,0) as ACWTime ,isnull(Busy,0) as BusyTimeFROM ( SELECT agentID,Interval,[state],NewDuration FROM cte2 ) as t1PIVOT ( sum(NewDuration) For [State] in ([ACW],[Busy],[NotReady],[Ready]) ) pvt
Everyday I learn something that somebody else already knew