Hãy thử điều này:
;with cte as
(select *, rank() over(partition by ID_Emp order by [Date]) rn
from attendance)
select src.ID_Emp, src.Name, convert(date, src.[Date]) as [Date],
concat(datepart(hour,src.[Date]),':',datepart(minute,src.[Date])) as [TimeIn],
concat(datepart(hour,tgt.[Date]),':',datepart(minute,tgt.[Date])) as [TimeOut],
concat(datediff(minute,src.[Date],tgt.[Date])/60,':',datediff(minute,src.[Date],tgt. [Date])%60) as [Hours]
from cte src
inner join cte tgt on src.ID_Emp = tgt.ID_Emp and src.rn + 1 = tgt.rn and src.rn % 2 = 1
Lưu ý:Tôi đã thử nghiệm điều này chỉ trên SQL Server 2008 R2, nhưng tôi cho rằng nó cũng sẽ hoạt động trên Oracle với các sửa đổi thích hợp.
Giải thích:Chúng tôi sử dụng RANK
chức năng sắp xếp theo ngày và giờ cho mỗi ID_Emp
. Sau đó, chúng tôi tham gia trên ID
và nhận các cặp hàng. Cuối cùng, để đảm bảo rằng chúng tôi không chọn mọi cặp hàng liên tiếp, chúng tôi đưa ra yêu cầu rằng thứ hạng của hàng nguồn phải là số lẻ.