Probeer dit:
;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
Waarschuwing:ik heb dit alleen getest op SQL Server 2008 R2, maar ik neem aan dat het ook op Oracle zou moeten werken met de nodige aanpassingen.
Uitleg:We gebruiken de RANK
functie om te bestellen op datum en tijd voor elke ID_Emp
. Dan doen we mee op ID
en krijg paren van rijen. Ten slotte, om ervoor te zorgen dat we niet elk paar opeenvolgende rijen selecteren, stellen we een vereiste dat de rangorde van de bronrij oneven moet zijn.