I have something close , it need a little touch(I don't have time in this mom)
but here it is:
;WITH cte AS
(SELECT 6665157 AS Code,'ENTER' AS Activity,'2016-05-17 08:13:43' AS TimeDate UNION ALL
SELECT 6665157 ,'ENTER' ,'2016-05-17 08:14:17' UNION ALL
SELECT 6665157 ,'EXITS' ,'2016-05-17 12:14:49' UNION ALL
SELECT 6665157 ,'EXITS' ,'2016-05-17 12:24:23' UNION ALL
SELECT 6665157 ,'ENTER' ,'2016-05-17 12:26:04' UNION ALL
SELECT 6665157 ,'ENTER' ,'2016-05-17 12:26:39' UNION ALL
SELECT 6665157 ,'EXITS' ,'2016-05-17 12:33:22' UNION ALL
SELECT 6665157 ,'ENTER' ,'2016-05-17 13:02:43' UNION ALL
SELECT 6665157 ,'ENTER' ,'2016-05-17 13:48:48' UNION ALL
SELECT 6665157 ,'EXITS' ,'2016-05-17 18:11:32'
)
,cteFilter
AS(
SELECT
Code
,Activity
,MAX(TimeDate) AS Max_TimeDate
FROM
(
SELECT
Code
,Activity
,TimeDate
,ROW_NUMBER() OVER(PARTITION BY Code , DATEADD(DAY,DATEDIFF(DAY,0,TimeDate),0) ORDER BY TimeDate ASC)
- ROW_NUMBER() OVER(PARTITION BY Code , DATEADD(DAY,DATEDIFF(DAY,0,TimeDate),0),Activity ORDER BY TimeDate ASC) AS Grp
FROM
cte AS A
)A
GROUP BY
Code
,Activity
,GRP
)
,cteWithNextRow
AS(
SELECT
Code
,Activity
,Max_TimeDate
,LEAD(Max_TimeDate,1,Max_TimeDate) OVER(PARTITION BY Code , DATEADD(DAY,DATEDIFF(DAY,0,Max_TimeDate),0) ORDER BY Max_TimeDate ASC) AS Max_TimeDate_NextRow
FROM
cteFilter
--ORDER BY
--Max_TimeDate
)
,cteFinal
AS(
SELECT
Code
,Activity
,Max_TimeDate
,Max_TimeDate_NextRow
,DATEDIFF(SECOND,Max_TimeDate,Max_TimeDate_NextRow) AS DiffSec
FROM
cteWithNextRow
)
SELECT DISTINCT
Code
,MIN(MAX_TimeDate) OVER(PARTITION BY Code , DATEADD(DAY,DATEDIFF(DAY,0,Max_TimeDate),0) ORDER BY Max_TimeDate ASC
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS StartTime
,MAX(MAX_TimeDate) OVER(PARTITION BY Code , DATEADD(DAY,DATEDIFF(DAY,0,Max_TimeDate),0) ORDER BY Max_TimeDate ASC
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS EndTime
,SUM(CASE WHEN Activity = 'ENTER' THEN DiffSec ELSE 0 END) OVER(PARTITION BY Code , DATEADD(DAY,DATEDIFF(DAY,0,Max_TimeDate),0) ORDER BY Max_TimeDate ASC
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS WorkHoursInSec
,SUM(DiffSec) OVER(PARTITION BY Code , DATEADD(DAY,DATEDIFF(DAY,0,Max_TimeDate),0) ORDER BY Max_TimeDate ASC
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS TotalHours
,SUM(CASE WHEN Activity = 'EXITS' THEN DiffSec ELSE 0 END) OVER(PARTITION BY Code , DATEADD(DAY,DATEDIFF(DAY,0,Max_TimeDate),0) ORDER BY Max_TimeDate ASC
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS BreakTime
FROM
cteFinal
The output for this is:
Code StartTime EndTime WorkHoursInSec TotalHours BreakTime
6665157 2016-05-17 08:14:17 2016-05-17 18:11:32 31173 35835 4662
I know is not the same as your's output ...