2011-11-29 6 views
0

출석 관리 시스템을 연구 중입니다.이 데이터를 SQL로 어떻게 쿼리합니까?

나는 인 타임, 두 번째 LogTime (오후 1시 51분 0초) OUTTIME로 첫 LogTime (오전 9시 44분 0초)를 표시 할
LogId  EmployeeId  LogTime       Date 
31   22    09:44:00 AM     2011-11-04 00:00:00.000 
40   22    01:51:00 PM     2011-11-04 00:00:00.000 
43   22    02:14:00 PM     2011-11-04 00:00:00.000 
45   22    07:36:00 PM     2011-11-04 00:00:00.000 

, 세 번째 LogTime :

내 테이블 데이터는 다음과 같이이다 (02:14:00 PM)을 InTime Etc로 설정합니다. 그런 다음 특정 날의 모든 INOut 시간에 대한 요약을 원합니다.

+1

단지 참고 사항. 나는 자정 버그를 피하기 위해 시간과 날짜 열을 결합 할 것이다. –

+2

나는이 같은 질문이 어제 물었다는 것을 알았다. ... –

+0

@AdamWenger : hehe - deja vu, eh? 나는 우리가 그 사람들에게 "InTime/OutTime과 함께하는 방법"을 이미 물었던 사람이 있다고 생각합니다. 그것이 stadard 시험인지 또는 모두가 걸려 넘어 지는지 확신 할 수는 없습니다 ..... –

답변

0
SELECT ROW_NUMBER() OVER (PARTITION BY EmployeeId ORDER BY LogId) % 2 AS InTime, 
     * FROM TimeStampTable 

이것은 EmployeeId하고 나머지 InTime = 0 각 ... 시간을 1, 3, 5 주셔서 InTime = 1 제공합니다.

0

내 솔루션 :이 정확히 필요한 것입니다

select *, Case (ROW_NUMBER() over (ORDER BY LogId)) % 2 
When 1 Then 'In Time' Else 'Out Time' End as 'Row' from @Table 

희망.

select CASE(N.Row) 
When 1 then N.LogTime Else null End as InTime, 
CASE(N.Row) When 0 then N.LogTime Else null End as OutTime, N.* from 
(select ROW_NUMBER() over (ORDER BY LogId) % 2 as 'Row',* from @Table) N 
+0

하지만 Intime과 Outtime을 별도의 열에 하나의 열에 표시해야합니다. CASE (N.Row)를 한 후, 인 타임 등 N.LogTime null를 끝 CASE (N.Row) 0 다음과 같은 OUTTIME N.LogTime null를 끝 N. * ( 선택 ROW_NUMBER 행 (선택 – Janki

+1

) 이상 (ORDER BY LogId) % 2을 'Row'로, * 표를 @Table ) N –

-1

난 내가 필드라는 테이블 타이밍을 만든 것을 사용할 수 있습니다 작은 문제가 SQL 서버에서 사용할 수 병합 기능을 문제를 분할하여이 작업을 수행하기 위해 노력했다 (LOGID, 직원 ID, LogTime, 일)

펀치 레코드는 다음 쿼리

declare @Punch nvarchar(100) 
set @punch='' 

select @punch=Coalesce(cast(datepart(HH,logtime)as nvarchar)+':'+cast(datepart(MI,logtime)as nvarchar)+(case (row_number() over (order by logid))%2 when 0 then ' Out' else ' In' end)+','[email protected],@punch) from timing order by logid desc 

select @punch as punches 

를 사용하여 당신은이 항아리

,369 같은 것을 사용할 수있는 기간 동안 수집 할 수
declare @duration int 
set @duration=0 
SELECT 
    @duration = coalesce((case row_number() over (order by t1.logid) %2 
    when 1 
    then cast(datediff(mi,t1.logtime,isnull(t2.logtime,t1.logtime))as int) else 0 end)[email protected],@duration) 
FROM 
    timing AS t1 
LEFT JOIN 
    timing AS t2 
     ON t2.logid = (SELECT MIN(logid) FROM timing WHERE logid > t1.logid) 
select @duration 
관련 문제