sql >> Database >  >> RDS >> Sqlserver

SQL Query voor tijd In/Uit aanwezigheid

Probeer dit:

;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

Waarschuwing:ik heb dit alleen getest op SQL Server 2008 R2, maar ik neem aan dat het ook op Oracle zou moeten werken met de nodige aanpassingen.

Uitleg:We gebruiken de RANK functie om te bestellen op datum en tijd voor elke ID_Emp . Dan doen we mee op ID en krijg paren van rijen. Ten slotte, om ervoor te zorgen dat we niet elk paar opeenvolgende rijen selecteren, stellen we een vereiste dat de rangorde van de bronrij oneven moet zijn.



  1. Hoe voorloopnullen van datums in Oracle te verwijderen

  2. Hoe maak je een back-up van een Postgresql-DB via JDBC?

  3. postgres:uitvoerbare query ophalen van query met parameters

  4. Groeperen door niet te werken met 2 velden sum