在sql server

时间:2015-05-28 04:29:07

标签: sql sql-server database stored-procedures

我正在制作一个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 

1 个答案:

答案 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;

最后一位需要进行一些更新才能获得正确的语法,以便以小时为单位报告时间戳的差异