इसे आजमाएं:
;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
. पर जुड़ते हैं और पंक्तियों के जोड़े प्राप्त करें। अंत में, यह सुनिश्चित करने के लिए कि हम लगातार पंक्तियों की प्रत्येक जोड़ी का चयन नहीं करते हैं, हम इसे एक आवश्यकता बनाते हैं कि स्रोत पंक्ति की रैंक विषम होनी चाहिए।