我有一个sql表,其中有一个名为LogicalReaderType的列,用于确定某人是否正在进行当天的进出。还有另一个名为BadgeTime的列,它是当时的时间戳。我想计算当天的工作时数。
两个警告:
以下是我将与之合作的一名员工的一周价值的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
如果我能提供更多详细信息,请告诉我。
编辑:添加了一些可用的其他字段。
答案 0 :(得分: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