Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Requête SQL pour l'heure d'entrée / de sortie

Essayez ceci :

;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

Mise en garde :J'ai testé cela uniquement sur SQL Server 2008 R2, mais je suppose que cela devrait également fonctionner sur Oracle avec les modifications appropriées.

Explication :Nous utilisons le RANK fonction pour trier par date et heure pour chaque ID_Emp . Ensuite, nous nous joignons sur ID et obtenir des paires de lignes. Enfin, afin de nous assurer que nous ne sélectionnons pas toutes les paires de lignes consécutives, nous imposons que le rang de la ligne source soit impair.