【问题标题】:Query Logic for Count for employee late arrivals for every month in sql server在sql server中查询每个月员工迟到的计数逻辑
【发布时间】:2015-05-28 04:29:07
【问题描述】:

我正在制作一个 SP 来计算每个员工每月的迟到。我面临的问题是,当用户在上午 12:00 之后坐下时,我无法获得最后一次打卡时间,因为我们的时间机器需要在上午 12:00 之前强制打卡,如果您还要在此之后坐下。我们必须在凌晨 12:05 再次打卡。我到目前为止所做的查询如下:

SELECT  ( CASE WHEN CONVERT(CHAR(5), PunchInTime, 108) <= '09:05'
AND CONVERT(CHAR(5), DATEADD(day, -1, PunchOutTime), 108) < '20:00'
      THEN 'On Time'
      WHEN CONVERT(CHAR(5), PunchInTime, 108) > '09:05'
      AND CONVERT(CHAR(5), DATEADD(day, -1, PunchOutTime), 108) < '20:00'
      THEN 'Late'
      WHEN CONVERT(CHAR(5), PunchInTime, 108) <= '09:05'
      AND CONVERT(CHAR(5), DATEADD(day, -1, PunchOutTime), 108) < '21:00'
      THEN 'On Time'
      WHEN CONVERT(CHAR(5), PunchInTime, 108) <= '10:05'
      AND CONVERT(CHAR(5), DATEADD(day, -1, PunchOutTime), 108) < '21:00'
      THEN 'On Time'
      WHEN CONVERT(CHAR(5), PunchInTime, 108) > '10:05'
      AND CONVERT(CHAR(5), DATEADD(day, -1, PunchOutTime), 108) < '21:00'
      THEN 'Late'
      WHEN CONVERT(CHAR(5), PunchInTime, 108) <= '10:35'
      AND CONVERT(CHAR(5), DATEADD(day, -1, PunchOutTime), 108) < '22:00'
      THEN 'On Time'
      WHEN CONVERT(CHAR(5), PunchInTime, 108) > '10:35'
      AND CONVERT(CHAR(5), DATEADD(day, -1, PunchOutTime), 108) < '22:00'
      THEN 'Late'
      WHEN CONVERT(CHAR(5), PunchInTime, 108) <= '02:05'
      AND CONVERT(CHAR(5), DATEADD(day, -1, PunchOutTime), 108) >= '22:00'
      THEN 'On Time'
      WHEN CONVERT(CHAR(5), PunchInTime, 108) > '02:05'
      AND CONVERT(CHAR(5), DATEADD(day, -1, PunchOutTime), 108) BETWEEN '22:00' AND '00:00'
      THEN 'Late'                 
      ELSE 'No record found'
      END ) AS Status, *
        FROM    dbo.LaunchPad_TimeHistory ;

我在这里使用day - 1 逻辑,但在这种情况下它会失败,因为该员工打卡时的日期会发生变化。请在这方面提供帮助。

表结构为:

Status  ID  EmpID  PunchInTime              PunchOutTime                 LastAccessTime         ForcedPunchOut  Notes
On Time  1   100   2015-04-23 18:00:00:0000 2015-04-23 18:00:00:0000      2015-04-23 12:23:41      0           ABC 

【问题讨论】:

  • 请发布您的表结构示例输入和预期输出。
  • 预期输出只是所有位的计数数字,它将每天增加,表明您本月迟到 5 次或本月迟到 6 次。
  • 那么每个员工每天只有一行?
  • 是的,通常是一个,但是当他在上午 12:00 打卡并在 12:05 再次打卡以进行迟到时,将增加 2 列打卡和打卡时间。现在我必须得到最后一次打卡,我可以根据我们的时间板计算他/她的迟到。我对数据库有点新手,在这方面需要一些帮助。

标签: sql sql-server database stored-procedures


【解决方案1】:

您的查询似乎主要需要检查员工是否有(打卡 - 打卡)~ 11 小时。在这种情况下,最好完全重构查询以验证以下条件: (打卡时间 + 员工预计工作的小时数)

只要输入数据被捕获为时间戳,数据库就会处理所有必要的转换(第二天/前一天)。

由于将为强制打卡场景添加新行,因此您可以首先创建一个中间表,该表将通过丢弃在上午 12:00 到 5:00 之间记录的所有打卡条目来仅保存打卡数据上午(假设没有人真的那么早上班!)。

with base_punch_in as ( 
select id#, empID, PunchInTime 
from dbo.LaunchPad_TimeHistory 
where PunchInTime not between '12:05:00' and '05:00:00' )

select a.PunchInTime, b.PunchOutTime, empID
from   base_punch_in a 
inner join
       dbo.LaunchPad_TimeHistory b
on     a.empID = b.empID
and    b.PunchOutTime > a.PunchInTime
and    timestampdiff(b.PunchOutTime - a.PunchInTime ) <= 24 hours;

最后一点需要更新一下,以获取正确的语法以报告以小时为单位的时间戳差异

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多