Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Truy vấn SQL về thời gian tham gia Vào / Ra

Hãy thử điều này:

;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

Lưu ý:Tôi đã thử nghiệm điều này chỉ trên SQL Server 2008 R2, nhưng tôi cho rằng nó cũng sẽ hoạt động trên Oracle với các sửa đổi thích hợp.

Giải thích:Chúng tôi sử dụng RANK chức năng sắp xếp theo ngày và giờ cho mỗi ID_Emp . Sau đó, chúng tôi tham gia trên ID và nhận các cặp hàng. Cuối cùng, để đảm bảo rằng chúng tôi không chọn mọi cặp hàng liên tiếp, chúng tôi đưa ra yêu cầu rằng thứ hạng của hàng nguồn phải là số lẻ.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách tính tuổi (theo năm) dựa trên Ngày sinh và getDate ()

  2. Cách bắt các ngoại lệ hết thời gian chờ của SQLServer

  3. Lệnh tùy chỉnh SQL bởi

  4. SQL Server:Cột thành hàng

  5. Quyền của Dịch vụ Báo cáo trên SQL Server R2 SSRS