sql server 的语句统计外包人员出勤时间

需要用sql server 的语句统计外包人员出勤时间
两个需求:
1。按各公司别统计
2。按某个人员别统计 可以用姓名或者工号当做查询条件
需要注意的问题有几点:
有可能当天的某个人员只有出门刷卡的记录因为是前一天晚上进来作业的,有需要知道前一天是否有进公司作业的记录来得出该人工的工时

希望查询出来的数据列表增加一列 工时计算结果弹性列

工号是id,姓名是name,公司别是dept。上班是 AttendanceArea为“门为入口” 反之下班则为“门卫出口”

图片说明

我自己的思考思路 t-sql语句
SELECT a.name ,a.dept,a.attendancedate ,
(SELECT CONVERT(DECIMAL(5,1), abs(DATEDIFF(SECOND, (SELECT MAX(c.attendancetime)FROM tab c WHERE DATEDIFF(DAY, c.attendancedate, a.attendancedate) = 0 AND c.name = a.name and c.attendancearea='门卫出口'), (SELECT MIN(c.attendancetime)FROM tab c WHERE DATEDIFF(DAY, c.attendancedate, a.attendancedate) = 0 AND c.name = a.name and c.attendancearea='门卫入口'))/3600.0)) )AS PerHours
FROM tab a
join tab.[dbo].ToOutGroup as b on a.dept=b.wbgroup where a.[AttendanceArea] in ('门卫入口','门卫出口')
GROUP BY a.name ,a.dept,
a.attendancedate
order by a.name asc

https://www.cnblogs.com/wangfuyou/p/5670889.html

建议还是放在后台代码里处理,写那种复杂的sql语句,执行效率低,改起来也不好改

我给个思路,如果觉得可行,需要我写代码,再贴代码:
写两个数据库函数,来作为出门的日期和时间的取数函数(存储过程)
func1: GetOutDate(ID, AttendanceDate, AttendanceTime) 根据入门日期和时间来计算“出门日期”
func2: GetOutTime(ID, AttendanceDate, AttendanceTime) 根据入门日期和时间来计算“出门时间”

然后:
Select id, name,dept, AttendanceDate, AttendanceTime, AttendanceArea, GetOutDate(id, AttendanceDate, AttendanceTime) As OutDate, GetOutTime(id, AttendanceDate, AttendanceTime) As OutTime, '门卫出口' As OutArea
From [出勤] Where [出勤].AttendanceArea = '门卫入口'

这样就得到了一个入门出门对应的考勤记录,没有出门的,函数可以取一个Null出来。

只有下班打卡的那种情况,你也没说怎么计算啊,是第二天下班打卡时间减去第一天上班打卡时间还是怎么计算?如果我前天上班打卡,两天后下班打卡呢?有没有这种情况,你都没有说,另外数据量大小你也没有说,表结构叙述也不全。很多话都不通顺...