Prøv dette:
;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
Advarsel:Jeg har kun testet dette på SQL Server 2008 R2, men jeg antager, at det også burde fungere på Oracle med passende ændringer.
Forklaring:Vi bruger RANK
funktion for at bestille efter dato og klokkeslæt for hver ID_Emp
. Derefter tilslutter vi os på ID
og få par af rækker. Endelig, for at sikre, at vi ikke vælger hvert par af på hinanden følgende rækker, stiller vi det til et krav, at kilderækkens rangering skal være ulige.