Sql 根据打卡/下班数据标记上班迟到的员工

Sql 根据打卡/下班数据标记上班迟到的员工,sql,sql-server-2012,Sql,Sql Server 2012,我目前正在做一个私人项目,我被难倒了。我有一个数据样本表,其中包含XYZ公司员工的打卡和打卡数据。下面是表格的快速浏览,PUNCHDTL: 我想创建一个单独的表,我可以称之为PUNCH_FLAG,在这里我可以识别员工在轮班开始或结束时打卡太晚或太早的情况。所有员工都应该在小时(即下午1:00、下午2:00、下午3:00等)开始工作,如果有人不在他们开始或结束时间的5分钟内(早或晚),我想在时间表中间加上标记。因此,该表基本上如下所示: 在第二个和第三个时间表中,您可以看到员工在打卡时间的5分

我目前正在做一个私人项目,我被难倒了。我有一个数据样本表,其中包含XYZ公司员工的打卡和打卡数据。下面是表格的快速浏览,PUNCHDTL:

我想创建一个单独的表,我可以称之为PUNCH_FLAG,在这里我可以识别员工在轮班开始或结束时打卡太晚或太早的情况。所有员工都应该在小时(即下午1:00、下午2:00、下午3:00等)开始工作,如果有人不在他们开始或结束时间的5分钟内(早或晚),我想在时间表中间加上标记。因此,该表基本上如下所示:

在第二个和第三个时间表中,您可以看到员工在打卡时间的5分钟之内,但在打卡时间的5分钟之外。上个月我一直在学习SQL,我遇到了一些困难

基本上,我需要创建一个单独的表,同时还需要使用识别是否应该标记某些内容的逻辑。如果你认为这很容易,那么还有更多!员工可以在白天休息进餐,因此每班可以有两次打卡时间。当有人打卡吃饭时,不管他们是否在下班前5分钟内离开,当他们打卡回来时也是如此。因此,重要的是要认识到打卡是在班次的第一个还是第二个班次,打卡也是在第二个班次

在我看来,解决这个问题需要天才!我很想看看有一些SQL智慧的人如何解决这个问题。请随时提问


谢谢大家!

您的第一步是确定轮班的第一个打卡人。正如其他人所评论的,您很可能需要将其与某种计划进行比较。在最简单的情况下,如果每个员工都有一个从早上开始到晚上结束的时间表,您可以确定每天的第一个打卡时间:

Select EmployeeID
, cast(Actual_punchInTime as Date) as Day
, Min(Actual_punchInTime) as FirstPunchTime
From MyTable
Group by EmployeeID
, cast(Actual_punchInTime as Date) as Day
然后,您可以使用
datepart
来确定邮票的时间间隔,如下所示:

Select *
, Case when Datepart(minute, FirstPunchTime) between 5 and 55 
         then 1 
       else 0 end as OffTheHourFlag

在其他表格(可能是InPunchEvent和OutPunchEvent)中,您是否指出这是开始工作的打卡,还是开始休息,或开始加班等。。。以及为结束换档、休息等而进行的punchingOut?这将帮助您只检查PunchDtl中相关的记录。此外,如果有人迟到1小时,他们现在似乎会准时出现,因为不知道他们应该什么时候到达。您是否跟踪员工表中每个员工的预期开始/停止时间?这也有助于您将查询限制为仅搜索相关数据点。@AdamWenger因为它只是一组样本数据,所以没有附加计划数据,但实践中的一个问题提出了这个问题。你对迟到一个小时提出了一个很好的观点,但我认为这样做的目的是为了显示屡犯者。当然,如果有人迟到一次,它不会被标记,但在一个月的时间里,它会显示谁经常迟到。@Paul我不确定你是不是在开玩笑。这是我正在做的一个练习,我需要一些帮助,因为这似乎是一个现实世界的问题。我总是可以跳过它,但它似乎很有挑战性,我想看看有人会如何解决这个问题。这听起来不像是个人项目,更像是家庭作业。这个问题作为家庭作业已经足够有趣了,但是集合中确实没有足够的数据可以干净地处理。我想看看设定的时间表,他们在做什么样的登记等等。。。看一个日期的分钟数是否在5到55之间(您的示例延迟值)很简单,但是如果没有更多的细节,我对这个答案就没有信心了。@Walker,使用这个函数。你可以通过谷歌搜索得到很多基本的帮助。Paul也是对的,如果您向SO社区展示您的代码,并且您已经尝试自己解决问题,那么您有更好的机会获得想要帮助的人。