我有一个表名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 =时间上的差异
等等。第二和第三。
答案 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
上的第三个版本