Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL-Abfrage für Anwesenheitszeiten

Versuchen Sie Folgendes:

;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

Vorbehalt:Ich habe dies nur auf SQL Server 2008 R2 getestet, aber ich gehe davon aus, dass es mit entsprechenden Modifikationen auch auf Oracle funktionieren sollte.

Erläuterung:Wir verwenden den RANK Funktion zum Sortieren nach Datum und Uhrzeit für jeden ID_Emp . Dann verbinden wir uns mit ID und erhalten Sie Zeilenpaare. Um schließlich sicherzustellen, dass wir nicht jedes Paar aufeinanderfolgender Zeilen auswählen, machen wir es zur Bedingung, dass der Rang der Quellzeile ungerade sein sollte.