【问题标题】:Bio-Metric device record生物计量设备记录
【发布时间】:2017-07-04 18:06:21
【问题描述】:

您好,我从生物识别设备获取数据,例如:-

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

我想从上面的表记录中获取数据,例如:-

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

PS:重复的 IN 或 OUT 被忽略。原始数据中的第 13、14、17 和 18 行。 2. 小时计算时,分钟为小时的小数点。

我需要 Sql-Server 查询的帮助来获得这些结果。

我当前的代码对我没有帮助,还会留下一些行并得到错误的结果和总小时数,谢谢:)

注意:- 当我的查询执行时缺少两行:-

|456    |51         | 2017-02-13 01:30:15.000    |1          
|463    |51         | 2017-02-13 02:52:02.000    |0

【问题讨论】:

标签: sql-server sql-server-2008 sql-server-2005 sql-server-2008-r2 sql-server-ce


【解决方案1】:

假设0 输入,1 输出。

CheckOut 在第二天时,我添加了一个Overnight 列以返回1。不需要的可以注释掉。

使用cross apply()

rextester:http://rextester.com/ENFRC28977

with cte as (
  select 
      Id
    , EmpCode
    , WorkDate
    , InOutMode
    , Lag_InOutMode = Lag(InOutMode) over (order by EmpCode, WorkDate)
  from t
)
select 
    i.EmpCode
  , WorkDate = convert(varchar(10),convert(date,i.WorkDate))
  , Overnight = case when datediff(day,i.WorkDate,o.WorkDate)>0 then 1 else 0 end
  , CheckIn  = convert(time,i.WorkDate)
  , CheckOut = convert(time,o.WorkDate)
  , TotalHours = datediff(second,i.WorkDate,o.WorkDate)/3600.0
from cte i 
cross apply (
    select top 1 WorkDate
    from cte o
    where o.EmpCode = i.EmpCode
      and o.InOutMode = 1
      and o.Lag_InOutMode != 1
      and o.WorkDate > i.WorkDate
    order by o.WorkDate asc
    ) as o
where i.InOutMode = 0 
  and i.Lag_InOutMode != 0
order by i.WorkDate

返回:

+---------+------------+-----------+----------+----------+------------+
| EmpCode |  WorkDate  | Overnight | CheckIn  | CheckOut | TotalHours |
+---------+------------+-----------+----------+----------+------------+
|      51 | 2017-02-13 |         0 | 02:52:02 | 05:11:54 | 2,331111   |
|      51 | 2017-02-13 |         0 | 20:08:52 | 22:38:51 | 2,499722   |
|      51 | 2017-02-13 |         0 | 22:59:18 | 23:18:17 | 0,316388   |
|      51 | 2017-02-13 |         1 | 23:33:44 | 05:04:16 | 5,508888   |
|      51 | 2017-02-14 |         0 | 05:05:17 | 05:08:17 | 0,050000   |
|      51 | 2017-02-14 |         0 | 20:09:23 | 21:59:23 | 1,833333   |
|      51 | 2017-02-14 |         0 | 22:30:28 | 22:49:51 | 0,323055   |
+---------+------------+-----------+----------+----------+------------+

我在'2017-02-13 01:30:15' 之前没有看到0 InOutMode,因此我的结果不包含以下行:

|51        |2017-02-13     |23:33:44   |01:30:15   |3.103330000

【讨论】:

  • 谢谢,但上面查询中缺少一些行:( |456 |51 | 2017-02-13 01:30:15.000 |1 |463 |51 | 2017-02-13 02:52:02.000 |0
  • @GoutamSingh 正如我在答案底部所说,2017-02-13 01:30:15CheckOut 之前没有 CheckIn。所以不会有争议。此外,如果您查看我的结果,您会注意到第一行是CheckIn2017-02-13 02:52:02.000,所以它显然没有丢失。您为什么不再次查看示例数据和预期结果?每次你问一个新问题时,看起来你只是把它混搭起来。例如您可以跨问题重复使用具有不同工作日期的 ID,并跨问题更改工作日期。这显然不是您正在使用的有效示例
  • @Sqlzip 谢谢 :) 是的,实际上数据有问题,我解决了感谢支持 :)
  • @GoutamSingh 你应该考虑接受这个答案,因为它显然导致了解决方案
猜你喜欢
  • 2017-07-04
  • 2013-01-18
  • 1970-01-01
  • 2018-06-12
  • 1970-01-01
  • 2016-08-04
  • 2020-07-16
  • 2011-05-06
  • 1970-01-01
相关资源
最近更新 更多