我如何从该表中找到每个员工的工作时间?

时间:2019-06-26 20:25:23

标签: sql sql-server

我试图弄清楚如何计算每位员工每天的工作时间,但返回的数字远不算多少。我需要的部分摘自这张图中所示的一张桌子。 Table

它显示一位员工一天的活动(还有很多记录,我只是选择显示一天)。大多数员工都会吃午餐,这就是为什么他们要进行2次打孔和2次打孔。

另一个表已与之连接,但目前并不重要。

InOut列显示他们是在打孔还是在打孔。 In = 1,Out =0。

我尝试了以下代码。 datediff似乎没有返回正确的数字。

select sr_name, 
cast(punchintime as date) as workdate,
ROUND(sum(cast(datediff(minute,punchintime, punchouttime) as real)/60),2) as hoursworked
from
(
select sr_name,
punchintime = punchdatetime,
punchouttime = ISNULL((select top 1 pc2.punchdatetime 
from punchclock pc2 where pc2.punchdatetime > pc.punchdatetime and pc.servrepid = pc2.servrepid and pc2.inout = 0 order by pc2.punchdatetime), getdate())

from punchclock pc
join servicereps sr on pc.servrepid = sr.servrepid
where cast(pc.punchdatetime as date) >= '2019-01-01'
group by sr_name, punchdatetime, pc.ServRepID
) x

按sr_name分组,强制转换(以punchintime为日期),强制转换(punchouttime-punchtime为时间)

结果应为8小时左右,而不是此查询返回的20-30小时。

1 个答案:

答案 0 :(得分:1)

您始终会在查询中选择当天的最后打孔时间。

您应该使用

将TABLE打孔钟(AS冲孔,其中inout = 1)加入自身(在punchout.row_number = punch.row_number +1上的AS打孔),并在CTE中添加row_number,使用

row_number() over (partition by repID, year, month, day order by punchdatetime asc) 

检查this post以获得关于row_number()的更多详细信息

那么剩下的就是

SUM(datediff(punchin.punchdatetime, punchout.punchdatetime))