这是我的查询:
select A_In.emp_reader_id as empId,A_In.Belongs_to,B.emp_name,A_In.DeviceSerialNumber,
DT as EntryTime,
(
select min(DT) as OutTime
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
我需要计算进入时间和退出时间的差异。我用了
日期差异(小时,A_In.DT,A_out.退出时间(
显示错误:无法绑定多部分标识符"A_out.exittime"。
有人帮忙..
您基本上有三个选择:子查询、CTE 或 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,
datediff(hour, A_In.DT, A_out.ExitTime) as hourdiff
from trnevents A_In outer apply
(select min(DT) as ExitTime
from trnevents
where EVENTID = 0 and
A_Out.emp_reader_id = A_In.emp_reader_id
A_Out.DT > A_In.DT and DATEDIFF(day, A_In.Dt, A_Out.DT) = 0
) A_Out;
笔记:
- 使用窗口函数可以更有效地编写此内容。
-
EVENTID
可能是一个数字。 无论如何,如果您没有通配符,我建议=
而不是LIKE
。 -
DATEDIFF()
计算两个值之间的小时"转换"数。 因此,1:59:59 和 2:00:01 相隔一小时。 通常,您希望以秒为单位取差值并除以 (60*60(。 -
B.emp_name
未定义。 我认为这是您原始查询的错误转录。
使用交叉应用将您的最小日期应用于您的行,然后取差额。
阅读更多关于申请 这里 或 这里
Select A_In.emp_reader_id as empId,A_In.Belongs_to,B.emp_name,A_In.DeviceSerialNumber,
DT as EntryTime,x.OutTime, Datediff(HOUR,a_in.DT,x.Outtime) as DifferenceTime from trnevents a_in
CROSS APPLY (select min(DT) as OutTime
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
) x
我在查询中看不到A_out.exittime
名称的列。
但我认为使用OUTER APPLY
可能会解决您的问题。
SELECT A_In.emp_reader_id AS empId,
A_In.Belongs_to,
B.emp_name,
A_In.DeviceSerialNumber,
DT AS EntryTime,
ExitTime = E.OutTime
FROM trnevents A_In
OUTER APPLY
(
SELECT MIN(DT) AS OutTime
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
)E;