【发布时间】: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