Поскольку ваши значения Login
/Logout
находятся в том же столбце, что это может быть проще PIVOT
времена Войти/выхода из системы первого затем получить datediff
, чтобы определить общее количество времени сотрудник присутствует.
PIVOT
часть запроса заключается в следующем:
select empid, [1], [2]
from
(
select empid, checktime, checktype,
row_number() over(partition by empid, checktype order by checktime) rn
from yourtable
) src
pivot
(
max(checktime)
for checktype in ([1], [2])
) piv
См SQL Fiddle with Demo
Результатом этого является:
| EMPID | 1 | 2 |
---------------------------------------------------------------------------
| 5 | January, 03 2013 09:00:15+0000 | January, 03 2013 11:00:00+0000 |
| 5 | January, 03 2013 11:30:00+0000 | January, 03 2013 13:00:00+0000 |
| 5 | January, 03 2013 13:30:00+0000 | January, 03 2013 16:00:00+0000 |
| 5 | January, 03 2013 16:30:00+0000 | January, 03 2013 18:00:00+0000 |
После того, как данные в этой структуре, вы можете легко получить разницу во времени, применив функцию DateDiff()
.
Окончательный запрос, чтобы сгенерировать количество времени работник вошедшего в это:
select empid, sum(SecondsDiff)/3600 as TotalHours
from
(
select empid, datediff(ss, [1], [2]) SecondsDiff
from
(
select empid, checktime, checktype,
row_number() over(partition by empid, checktype order by checktime) rn
from yourtable
) src
pivot
(
max(checktime)
for checktype in ([1], [2])
) piv
) src
group by empid
См SQL Fiddle with Demo
И результат:
| EMPID | TOTALHOURS |
----------------------
| 5 | 7 |
[Что вы пробовали? ] (http://mattgemmell.com/2008/12/08/what-have-you-tried/) –
откровенно говоря, моя идея состояла в том, чтобы добавить все время входа в систему и время выхода из системы, а затем вычесть общее время выхода из общей суммы время входа в систему. Но, к сожалению, оператор «+» не поддерживается во временном формате. – ksg
Просмотрели ли вы документацию по SQL Server 2008, относящуюся к арифметике дат, в частности [DATEDIFF] (http://msdn.microsoft.com/) en-us/library/ms189794.aspx)? Это должно дать вам то, что вам нужно. –