SQL查询计算EntryTime与ExitTime时差时出现标识符绑定错误,求助
解决SQL中“多部分标识符无法绑定”的问题
嘿,这个问题我熟!你遇到的错误核心原因很简单:A_out.Exittime根本不是外部查询能识别的对象——ExitTime是你子查询返回的列别名,而A_Out只是子查询内部的临时表别名,出了那个小括号,外部查询就认不到它啦。
下面给你两种靠谱的解决办法:
方法一:用子查询包裹原查询,直接引用列别名
先把你原来的查询包装成一个子查询,这样生成的EntryTime和ExitTime就变成了外层查询可以直接调用的列,然后再计算时间差:
SELECT empId, Belongs_to, emp_name, DeviceSerialNumber, EntryTime, ExitTime, -- 直接用生成的列别名计算时间差 DATEDIFF(HOUR, EntryTime, ExitTime) AS WorkHours FROM ( SELECT A_In.emp_reader_id AS empId, A_In.Belongs_to, B.emp_name, A_In.DeviceSerialNumber, A_In.DT AS EntryTime, ( SELECT MIN(DT) FROM trnevents A_Out WHERE EVENTID LIKE '0' AND A_Out.emp_reader_id = A_In.emp_reader_id AND A_Out.DT > A_In.DT AND DATEDIFF(day, A_In.Dt, A_Out.DT) = 0 ) AS ExitTime FROM trnevents A_In -- 注意:你原查询里用到了表B,但没写JOIN条件!记得补上,比如: -- JOIN employee_table B ON A_In.emp_reader_id = B.emp_id ) AS AttendanceRecords -- 可选:过滤掉没有下班记录的条目 WHERE ExitTime IS NOT NULL
方法二:用APPLY关联(更高效,适合SQL Server)
如果你的数据库是SQL Server,推荐用CROSS APPLY来关联上班记录和对应的最早下班记录,这样在外部就能直接引用下班时间计算差值,性能也比子查询嵌套更好:
SELECT A_In.emp_reader_id AS empId, A_In.Belongs_to, B.emp_name, A_In.DeviceSerialNumber, A_In.DT AS EntryTime, A_Out.ExitTime, -- 这里直接引用APPLY子查询的结果列 DATEDIFF(HOUR, A_In.DT, A_Out.ExitTime) AS WorkHours FROM trnevents A_In -- 一定要补上B表的关联条件! JOIN employee_table B ON A_In.emp_reader_id = B.emp_id CROSS APPLY ( SELECT MIN(DT) AS ExitTime FROM trnevents WHERE EVENTID LIKE '0' AND emp_reader_id = A_In.emp_reader_id AND DT > A_In.DT AND DATEDIFF(day, A_In.Dt, DT) = 0 ) AS A_Out
额外提醒
如果存在员工当天只有上班记录、没有下班记录的情况:
- 用
CROSS APPLY会自动过滤掉这些条目; - 要是想保留这类记录,把
CROSS APPLY换成OUTER APPLY,此时ExitTime会是NULL,计算时间差时可以用ISNULL或者CASE处理,比如:DATEDIFF(HOUR, EntryTime, ISNULL(ExitTime, GETDATE()))(用当前时间代替未打卡的下班时间)。
内容的提问来源于stack exchange,提问作者Time Attendance System
相关产品推荐
相关产品推荐

