0

我有一个 sql 表,其中有一个名为 LogicalReaderType 的列,该列确定是否有人在当天签入或签出。还有另一列称为 BadgeTime,它是当时的时间戳。我想计算一天工作了多少小时。

两个警告:

  1. 有时人们会犯错误并标记出来(完成他们一天的时间)然后在没有标记的情况下回到门口。然后再次标记出来。我希望脚本能够做出最佳猜测或选择最早的一个,然后忽略第二个徽章。
  2. 人们确实在第三班工作,所以它需要足够聪明,能够跨越上午 12 点并且知道如何做数学。

这是我将与之合作的一名员工的一周价值 sql 输出的示例:

BadgeNumber     LastName    Initials    LogicalReaderType   BadgeTime   EmployeeNumber
153568488433    Doe J   3   41253.32631 54822
153568488433    Doe J   4   41253.68821 54822
153568488433    Doe J   3   41254.3187  54822
153568488433    Doe J   3   41254.31877 54822
153568488433    Doe J   4   41254.72185 54822
153568488433    Doe J   3   41255.32757 54822
153568488433    Doe J   4   41255.58274 54822
153568488433    Doe J   3   41255.6378  54822
153568488433    Doe J   4   41255.71527 54822
153568488433    Doe J   3   41256.31372 54822
153568488433    Doe J   4   41256.55927 54822
153568488433    Doe J   3   41256.56036 54822
153568488433    Doe J   4   41256.69249 54822
153568488433    Doe J   3   41257.3234  54822
153568488433    Doe J   4   41257.37054 54822
153568488433    Doe J   4   41257.69721 54822

作为示例输出,我想要一个像这样的表:

In              Out             WorkTime
41253.326308    41253.688206    0.361898
41254.318704                   -41253.318704
41254.318773    41254.721852    0.403079
41255.327569    41255.582743    0.255174
41255.637801    41255.715266    0.077465
41256.313715    41256.559271    0.245556
41256.560359    41256.692488    0.132129
41257.323403    41257.370544    0.047141
                41257.697211    41257.697211

让我知道我是否可以提供更多详细信息。

编辑:添加了一些其他可用的字段。

4

1 回答 1

2

您需要找到与每个出局相关的下一个徽章时间。最常用的方法是使用相关子查询。

一旦有时间,您就可以执行逻辑来获取工作时间。以下查询采用这种方法,并假设工作时间少于 1 天时下班时间有效:

select BadgeTime as In,
       (case when NextBadgeTime - BadgetTime < 1 then NextBadgeTime end) as Out,
       (case when NextBadgeTime - BadgetTime < 1 then NextBadgeTime - BadgeTime end) as WorkTime
from (select t.*,
             (select MIN(BadgeTime)
              from t t2
              where t2.BadgeNumber = t.BadgeNumber and
                    t2.LogicalReaderType = 4 and
                    t2.BadgeTime > t.BadgeTime
             ) NextOutTime
      from t
      where LogicalReaderType = 3
     ) t
于 2012-12-18T18:17:10.463 回答