SQL计算每日时间

时间:2012-12-18 16:50:51

标签: sql datetime formula

我有一个sql表,其中有一个名为LogicalReaderType的列,用于确定某人是否正在进行当天的进出。还有另一个名为BadgeTime的列,它是当时的时间戳。我想计算当天的工作时数。

两个警告:

  1. 有时人们会犯错误并退出徽章(完成他们当天的时间),然后在没有签字的情况下回到大门。然后再次取消徽章。我希望脚本能够做出最佳猜测或选择最早的猜测,然后忽略第二个徽章。
  2. 人们确实在第三班工作,因此需要足够聪明才能越过上午12点并知道如何进行数学运算。
  3. 以下是我将与之合作的一名员工的一周价值的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
    

    如果我能提供更多详细信息,请告诉我。

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

1 个答案:

答案 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