计算In和out之间的时间差

时间:2013-09-03 07:53:23

标签: sql sql-server

我有一个表名checkinout,其中记录了员工打卡的所有记录。

看起来像:

  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的时间差(逐个)

例如:First I = 08:19

首先O =:12:37

所以08:19-12:37 =时间上的差异

等等。第二和第三。

1 个答案:

答案 0 :(得分:2)

如果您使用的是SQL Server 2012,请使用以下LAG函数:

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

可以在SQL Fiddle

上找到相关的工作示例

如果您使用的是SQL Server 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 

这是SQL Fiddle

上的第三个版本