2015-05-28 51 views
-2

我制作了一个SP来计算每个员工每月的迟到人数。我面临的问题是,当用户坐在中午12:00之后,我无法获得最后一次打卡时间,因为我们的时间机器需要在凌晨12:00之前被强制打出来,如果在此之后您要坐下来。我们又必须在凌晨12点05分进场。我做了,直到然而,查询如下:查询逻辑计数员工在sql server中每个月的迟到数量

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 
+0

请发表您的表结构样品的输入和输出预计在时间戳的差异。 – ughai

+0

预期输出只是每日增加的所有位的计数值,以显示您本月已经晚了5次或本月已经6次了。 –

+0

那么每个员工每天有一行? – ughai

回答

0

这样看来,您的查询主要是需要检查员工是否拥有(冲出来 - 打卡)〜11小时。在这种情况下,如果完全重新设置查询以验证以下条件会更好: (准时打卡+员工预计工作小时数)< =打卡时间。

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

由于为强制打卡方案添加了一个新行,因此您可以首先创建一个中间表,通过放弃在12:00 AM和5之间记录的所有打卡条目, 00 AM(假设没有人真的在那工作!)。

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; 

的最后一位必须在正确的语法有点更新的报告了小时