我正在制作一个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
答案 0 :(得分:0)
看来您的查询主要需要检查员工是否有(打卡 - 打卡)~11小时。在这种情况下,如果您完全恢复查询只是为了验证以下条件会更好: (打卡时间+员工预计工作小时数)&lt; =打卡时间。
只要输入数据被捕获为时间戳,数据库就会处理所有必要的转换(下一天/前一天)。
由于将为强制打孔方案添加新行,您可以先创建一个中间表,通过丢弃在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;
最后一位需要进行一些更新才能获得正确的语法,以便以小时为单位报告时间戳的差异