Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Zapytanie SQL dotyczące obecności na czas wejścia/wyjścia

Spróbuj tego:

;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

Zastrzeżenie:testowałem to tylko na SQL Server 2008 R2, ale zakładam, że powinno działać również na Oracle z odpowiednimi modyfikacjami.

Wyjaśnienie:używamy RANK funkcja do zamówienia według daty i godziny dla każdego ID_Emp . Następnie dołączamy na ID i zdobądź pary rzędów. Na koniec, aby upewnić się, że nie wybieramy każdej pary kolejnych wierszy, wymagamy, aby pozycja wiersza źródłowego była nieparzysta.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zakresy poziomu izolacji transakcji

  2. Czym NIE jest operator logiczny w SQL Server — samouczek SQL Server / TSQL — część 121

  3. Jak wybrać podzbiór kolumn z zestawu wyników procedury składowanej (T-SQL)

  4. Jak dołączyć MDF bez pliku dziennika?

  5. SQL Server 2005 - Przestawianie danych bez sumy/liczby i dynamicznej listy wartości