これを試してください:
;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
警告:これは SQL Server 2008 R2 でのみテストしましたが、適切な変更を加えれば Oracle でも動作するはずです。
説明:RANK
を使用します 各 ID_Emp
の日付と時刻で並べ替える関数 .次に、ID
で参加します 行のペアを取得します。最後に、連続する行のすべてのペアを選択しないようにするために、ソース行のランクが奇数であることを要件としています。