我试图弄清楚如何计算每位员工每天的工作时间,但返回的数字远不算多少。我需要的部分摘自这张图中所示的一张桌子。 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小时。
答案 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))