Sql server 来自生物测量设备的考勤记录

Sql server 来自生物测量设备的考勤记录,sql-server,sql-server-2008,sql-server-2005,sql-server-2008-r2,sql-server-ce,Sql Server,Sql Server 2008,Sql Server 2005,Sql Server 2008 R2,Sql Server Ce,这是我的数据 |Id |EmpCode |CheckInCheckOutDate |WorkDate |InOutMode |247 |51 |2017-02-13 20:08:52.000 |2017-02-13 20:08:52.000 |0 |392 |51 |2017-02-13 22:38:51.000 |2017-02-13 22:38

这是我的数据

|Id     |EmpCode    |CheckInCheckOutDate        |WorkDate                   |InOutMode  
|247    |51         |2017-02-13 20:08:52.000    |2017-02-13 20:08:52.000    |0          
|392    |51         |2017-02-13 22:38:51.000    |2017-02-13 22:38:51.000    |1          
|405    |51         |2017-02-13 22:59:18.000    |2017-02-13 22:59:18.000    |0          
|415    |51         |2017-02-13 23:18:17.000    |2017-02-13 23:18:17.000    |1          
|423    |51         |2017-02-13 23:33:44.000    |2017-02-13 23:33:44.000    |0          
|456    |51         |2017-02-14 01:30:15.000    |2017-02-13 01:30:15.000    |1          
|463    |51         |2017-02-14 02:52:02.000    |2017-02-13 02:52:02.000    |0          
|483    |51         |2017-02-14 05:11:54.000    |2017-02-13 05:11:54.000    |1          
|1034   |51         |2017-02-14 20:09:23.000    |2017-02-14 20:09:23.000    |0          
|1172   |51         |2017-02-14 21:59:23.000    |2017-02-14 21:59:23.000    |1          
|1217   |51         |2017-02-14 22:30:28.000    |2017-02-14 22:30:28.000    |0          
|1238   |51         |2017-02-14 22:49:51.000    |2017-02-14 22:49:51.000    |1          
|1257   |51         |2017-02-14 23:19:10.000    |2017-02-14 23:19:10.000    |0          
|1315   |51         |2017-02-15 05:04:16.000    |2017-02-14 05:04:16.000    |1          
|1323   |51         |2017-02-15 05:05:17.000    |2017-02-14 05:05:17.000    |0          
|1329   |51         |2017-02-15 05:08:17.000    |2017-02-14 05:08:17.000    |1
|1330   |51         |2017-02-15 05:08:18.000    |2017-02-14 05:08:18.000    |1
我使用了以下代码:

SELECT EmpCode,
        CAST(I.CheckInCheckOutDate AS DATE) AS [Date],
        CAST(I.WorkDate AS DATE) AS WorkDate,
        CONVERT(VARCHAR(10), I.WorkDate, 108) AS CheckIn,
        CONVERT(VARCHAR(10), O.WorkDate, 108) AS CheckOut,
       CAST(DATEDIFF(second,I.WorkDate,O.WorkDate)/3600.0 AS DECIMAL(18,9)) [TotalHours]
FROM tblAttendance I
OUTER APPLY (
                SELECT TOP 1 WorkDate,inOutMode FROM tblAttendance t
                WHERE t.EmpCode = I.EmpCode AND t.WorkDate > I.WorkDate
                ORDER BY t.WorkDate
            ) O

WHERE I.inOutMode = 0
AND O.inOutMode = 1 and I.empCode=51
代码的结果是:

|EmpCode|Date|      |WorkDate   |CheckIn    |CheckOut   |TotalHours
|51     |2017-02-13 |2017-02-13 |20:08:52   |22:38:51   |2.499722000
|51     |2017-02-13 |2017-02-13 |22:59:18   |23:18:17   |0.316388000
|51     |2017-02-13 |2017-02-13 |23:33:44   |05:04:16   |5.508888000
|51     |2017-02-14 |2017-02-13 |02:52:02   |05:11:54   |2.331111000
|51     |2017-02-14 |2017-02-14 |20:09:23   |21:59:23   |1.833333000
|51     |2017-02-14 |2017-02-14 |22:30:28   |22:49:51   |0.323055000
|51     |2017-02-15 |2017-02-14 |05:05:17   |05:08:17   |0.050000000

每当我按WorkDate添加TotalHours组时,它给出的答案都不正确。

也许您需要添加一个明确的总和: :


(未测试,如果没有帮助,很抱歉-我知道非常有限的SQL:p)

也许您需要添加一个显式的总和: :


(未经测试,如果没有帮助,很抱歉-我知道SQL:p非常有限)

这里的人肯定喜欢点击关闭按钮。在我看来,OP显然已经在这个(他们的第一个)问题上下了功夫。我们需要帮助OP改进这个问题,而不是仅仅投票来关闭它。
每当我按WorkDate添加TotalHours组时,它给出的答案都是错误的。
这没有帮助。请添加您的预期结果和实际结果。所以请看这里来改进这个问题:这里的人肯定喜欢点击关闭按钮。在我看来,OP显然已经在这个(他们的第一个)问题上下了功夫。我们需要帮助OP改进问题,而不仅仅是投票结束问题。
每当我按WorkDate添加TotalHours组时,它给出的答案都不正确。
这没有帮助。请添加您的预期结果和实际结果。因此,请查看此处以改进问题:至少您的总和需要是查询中的一列。正如发布的那样,它是无效语法,因为总和只是在无处浮动。@SeanLange预期它不会起作用,但您的评论至少让我尝试提供帮助。至少您的总和需要是查询中的一列。正如发布的那样,这是无效的语法,因为总和只是在无处浮动。@SeanLange预计它不会起作用,但你的评论至少让我尝试帮助你。
SELECT TOP 1 WorkDate, inOutMode, SUM (TotalHours) FROM tblAttendance t

WHERE t.EmpCode = I.EmpCode AND t.WorkDate > I.WorkDate
GROUP BY WorkDate, inOutMode

ORDER BY t.WorkDate