sql >> Databasteknik >  >> RDS >> Sqlserver

SQL-fråga för time In/Out-närvaro

Prova detta:

;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

Varning:Jag har endast testat detta på SQL Server 2008 R2, men jag antar att det också borde fungera på Oracle med lämpliga ändringar.

Förklaring:Vi använder RANK funktion för att beställa efter datum och tid för varje ID_Emp . Sedan går vi med på ID och få par av rader. Slutligen, för att säkerställa att vi inte väljer varje par av på varandra följande rader, ställer vi som ett krav att källradens rangordning ska vara udda.



  1. Hur kan jag starta PostgreSQL på Windows?

  2. Avancerad failover med Post/pre Script Hooks

  3. Konstigt minnesanvändningsmönster i C# Windows Form-appen

  4. Passar PostgreSQL:s Ltree-modul bra för gängade kommentarer?