2013-01-04 5 views
-2

Я хочу рассчитать общее количество часов на сотрудника с 09:00 до 18:00.Как добавить время в SQL Server 2008?

Моя база данных выглядит так.

Как это сделать?

AttendanceId  EmpId   CheckTime     CheckType 
------------------------------------------------------------------------- 
    3    5    2013-01-03 09:00:15.000   1 (Login) 
    4    5    2013-01-03 11:00:00.000   2 (Logout) 
    5    5    2013-01-03 11:30:00.000   1 
    6    5    2013-01-03 13:00:00.000   2 
    7    5    2013-01-03 13:30:00.000   1 
    8    5    2013-01-03 16:00:00.000   2 
    9    5    2013-01-03 16:30:00.000   1 
    10    5    2013-01-03 18:00:00.000   2 
+3

[Что вы пробовали? ] (http://mattgemmell.com/2008/12/08/what-have-you-tried/) –

+0

откровенно говоря, моя идея состояла в том, чтобы добавить все время входа в систему и время выхода из системы, а затем вычесть общее время выхода из общей суммы время входа в систему. Но, к сожалению, оператор «+» не поддерживается во временном формате. – ksg

+3

Просмотрели ли вы документацию по SQL Server 2008, относящуюся к арифметике дат, в частности [DATEDIFF] (http://msdn.microsoft.com/) en-us/library/ms189794.aspx)? Это должно дать вам то, что вам нужно. –

ответ

2

Поскольку ваши значения 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 | 
0

Чтобы получить разницу между двумя датами, можно использовать функцию DATEDIFF: http://msdn.microsoft.com/en-us/library/ms189794.aspx

Я думаю, что вы должны сделать эту строку за строкой, хотя. Из-за структуры вашей таблицы вы не можете просто выполнить простой запрос.

Смежные вопросы