2013-09-03 2 views
-1

직원 펀치 기록이 모두 기록 된 테이블 이름 체크 아웃이 하나 있습니다.입/출력 시간 차이 계산

모양 같은 :

EMP_id  time   in/out 
    -------- --------------- ------- 
    11  8/19/2013 08:19 I  
    11  8/19/2013 12:37 O  
    11  8/19/2013 13:29 I  
    11  8/19/2013 14:19 O  
    11  8/19/2013 16:48 I  
    11  8/19/2013 18:44 O  

내가 (하나씩)

예를 들어 각각의 I와 O의 시간 차이를 계산하려면 : 먼저 I = 08 : 19

우선 O = 12 :

37이므로 08 : 19-12 : 37 = 초 및 제위한

등등 시간 차이 ird.

+4

의 세 번째 버전입니다 이거? SQL 서버, MySql, 오라클 등 – Tanner

+1

내가 항상 O를 따르는 것은 사실입니까? – exussum

+0

우리는 dbms를 알게되자 마자 커서를 사용하는 방법을 제공 할 수 있습니다. 또는 응용 프로그램에서 이러한 유형의 집계를 수행하는 것이 더 나을 수도 있습니다. 하루에 한 번만 체크 인하면 솔루션을 얻을 수 있습니다. – booyaa

답변

2

당신은 다음과 같이 LAG 함수를 사용하여 SQL 서버 2012을 사용하는 경우 :

SQL Server를 사용하는 경우 이에 대한 작업 예는 SQL Fiddle


에서 찾을 수 있습니다

SELECT *, 
     DATEDIFF(HH, TIME, LAG(TIME) 
          OVER ( 
           ORDER BY TIME)) 
FROM TABLE1 

2008 년 다음과 같이 자기 조인을해야합니다 :

SELECT *, 
     ROW_NUMBER() 
     OVER ( 
      ORDER BY TIME)RN 
INTO #TEMP1 
FROM TABLE1 

SELECT t1.*, 
     DATEDIFF(HH, t1.TIME, t2.TIME) 
FROM #TEMP1 t1 
     LEFT JOIN #TEMP1 t2 
       ON t1.RN = t2.RN - 1 

이것에 대해서는 SQL Fiddle에서 찾을 수 있습니다.


편집
이 같은 시도 hh:mm:ss 형식의 차이를 표시하려면 여기

SELECT *, 
     ROW_NUMBER() 
     OVER ( 
      ORDER BY TIME)RN 
INTO #TEMP1 
FROM TABLE1 

SELECT T.EMP_ID, 
     T.TIME, 
     T.[IN/OUT], 
     CASE WHEN DIFF/3600 <10 THEN '0' ELSE '' END + CAST(DIFF/3600 AS VARCHAR( 
     2)) + 
     ':' 
     + CASE WHEN DIFF%3600/60 < 10 THEN '0' ELSE '' END + CAST(DIFF%3600/60 AS 
     VARCHAR(2)) 
     + ':00' minutes 
FROM (SELECT t1.*, 
       DATEDIFF(SECOND, t1.TIME, t2.TIME) diff 
     FROM #TEMP1 t1 
       LEFT JOIN #TEMP1 t2 
         ON t1.RN = t2.RN - 1)T 

을 그리고 구체적으로 DBMS 무엇 SQL Fiddle

+0

안녕, 빠른 답장을 보내 주셔서 감사합니다 .. 내 열 이름은 "checktype"및 해당 데이터 형식 smalldatetime 및 각 I 및 O .. 당신 말이 맞아요하지만 당신에게 도움이 더 필요해. – user2742150

+0

내가 hh : mm : ss를 표시하려면 어떻게해야합니까? – user2742150

+0

업데이트 된 답변을 살펴보고 원하는 답변인지 알려주세요. – Gidil