Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

SQL заявка за време In/Out присъствие

Опитайте това:

;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

Предупреждение:Тествах това само на SQL Server 2008 R2, но предполагам, че трябва да работи и на Oracle с подходящи модификации.

Обяснение:Използваме RANK функция за подреждане по дата и час за всеки ID_Emp . След това се присъединяваме към ID и вземете двойки редове. И накрая, за да сме сигурни, че не избираме всяка двойка последователни редове, поставяме изискване рангът на изходния ред да е нечетен.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Синтаксична грешка близо до 'of' в условието за търсене в пълен текст 'control of'

  2. Странен знак в SQL база данни

  3. Създаване на динамични кутии (div) с различни заглавия, върнати от SP

  4. Можете ли да се обадите на уеб услуга от TSQL код?

  5. SQL заявка - Изтриване на дубликати, ако има повече от 3 дублирания?