sql >> Database teknologi >  >> RDS >> Sqlserver

SQL-forespørgsel for time-in/out-deltagelse

Prøv dette:

;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

Advarsel:Jeg har kun testet dette på SQL Server 2008 R2, men jeg antager, at det også burde fungere på Oracle med passende ændringer.

Forklaring:Vi bruger RANK funktion for at bestille efter dato og klokkeslæt for hver ID_Emp . Derefter tilslutter vi os på ID og få par af rækker. Endelig, for at sikre, at vi ikke vælger hvert par af på hinanden følgende rækker, stiller vi det til et krav, at kilderækkens rangering skal være ulige.



  1. mysql_query():hvordan man kontrollerer, om nogen rækker er opdateret i tilfælde af UPDATE SQL

  2. Kan du bruge et alias i WHERE-sætningen i mysql?

  3. tilslut java til mysql ved hjælp af jdbc på osx

  4. php mysql rækkefølge efter tidsstempel er forkert