2015-01-26 1 views
1

저는 SQL의 초보자입니다. 로그온 할 수있는 행이 있으며 각 로그온과 로그 오프 사이의 시간을 볼 수 있습니다. 사용자가 몇 시간 동안 로그온했는지 계산하고 싶습니다.sql에서 하루에 여러 번 로그인하고 로그 오프하는 사이의 로그인 시간을 계산하는 방법

select oneAA.DT, oneAA.first_name, oneAA.surname, oneAA.time, oneAA.name, oneAA.incID, --now add the hours 
twoAA.time, twoAA.name, twoAA.incID, 
    convert(varchar(5),DateDiff(s, oneAA.time, twoAA.time)/3600)+ ' hr '+ 
    convert(varchar(5),DateDiff(s, oneAA.time, twoAA.time)%3600/60)+' min '+ 
    convert(varchar(5),(DateDiff(s, oneAA.time, twoAA.time)%60))+ ' sec' as logOn_time 
--into #MatthewTime 
from #Matthews oneAA 
inner join #Matthews twoAA on twoAA.incID = oneAA.incID +1 
where oneAA.name = 'AcdAgentLoggedOnEvent' 

은이 나는 결과로 무엇을 얻을 수 있습니다 :

DT first_name surname time name incID time name incID logOn_time 
2015-01-05 Matthews Seforo 07:59:42 AcdAgentLoggedOnEvent 1 08:57:19 AcdAgentLoggedOffEvent 2 0 hr 57 min 37 sec 
2015-01-05 Matthews Seforo 08:57:54 AcdAgentLoggedOnEvent 3 10:08:14 AcdAgentLoggedOffEvent 4 1 hr 10 min 20 sec 
2015-01-05 Matthews Seforo 10:08:15 AcdAgentLoggedOnEvent 5 10:14:12 AcdAgentLoggedOffEvent 6 0 hr 5 min 57 sec 
2015-01-05 Matthews Seforo 10:27:08 AcdAgentLoggedOnEvent 7 10:33:17 AcdAgentLoggedOffEvent 8 0 hr 6 min 9 sec 
2015-01-05 Matthews Seforo 10:34:48 AcdAgentLoggedOnEvent 9 11:01:02 AcdAgentLoggedOffEvent 10 0 hr 26 min 14 sec 
2015-01-05 Matthews Seforo 12:04:15 AcdAgentLoggedOnEvent 11 13:29:14 AcdAgentLoggedOffEvent 12 1 hr 24 min 59 sec 
2015-01-05 Matthews Seforo 13:29:16 AcdAgentLoggedOnEvent 13 14:32:13 AcdAgentLoggedOffEvent 14 1 hr 2 min 57 sec 
2015-01-05 Matthews Seforo 14:32:45 AcdAgentLoggedOnEvent 15 16:32:40 AcdAgentLoggedOffEvent 16 1 hr 59 min 55 sec 
2015-01-05 Matthews Seforo 16:32:42 AcdAgentLoggedOnEvent 17 17:03:22 AcdAgentLoggedOffEvent 18 0 hr 30 min 40 sec 

내가 원하는 마지막 열을 추가하는 것입니다. 사전

+1

당신의 DATEDIFF의의 일을해야한다 그리고 누군가가 자정 통해 로그온되어있는 경우 예상 출력은 무엇인가? – jarlh

+1

appr을 사용하여 소식에 태그를 답니다. opridate RDBMS 태그. –

+0

이것은 근무 시간 동안의 것입니다. 그러나 누군가가 로그온 한 경우, 나는 그 시간에 사용자가 로그온 한 시간을 추가하여 결국에는보고 싶습니다. 나는 잘못된 방향으로 가고있을 수도 있지만 // 주석이 달린 임시 테이블로 볼 수있는 다른 접근 방식을 시도했습니다 – FioLynaly

답변

0

에서

덕분에 나는이 테스트 적이 없다하지만 난 당신이 (당신은 당신의 선택은 DT와 성, 이름에 의해 즉, 같은 방식으로 정렬되어 있는지 확인해야합니다 이런 식으로 뭔가를 찾고있을 것 같아요 .

convert(varchar(5),SUM(DateDiff(s, oneAA.time, twoAA.time)) Over (Partition by oneAA.surname, oneAA.first_name order by oneAA.DT) /3600) + ' hr '+ 
convert(varchar(5),SUM(DateDiff(s, oneAA.time, twoAA.time)) Over (Partition by oneAA.surname, oneAA.first_name order by oneAA.DT) % 3600/60)+' min '+ 
convert(varchar(5),SUM(DateDiff(s, oneAA.time, twoAA.time)) Over (Partition by oneAA.surname, oneAA.first_name order by oneAA.DT) %60)+ ' sec' as Overall_logOn_time 

그냥이에 추가, 당신은 정말. 어떤 시간 자정을 수용하기 위해 날짜보다는 시간

+0

그것은 고맙게 작동했다. 그러나 나는 주문을 삭제해야했다. 그리고 나는 행복하다. 당신은 영웅입니다. 감사합니다 – FioLynaly

+0

아무런 문제가 없으며 도와 드리겠습니다 :) –

관련 문제