2014-01-19 3 views
1

У меня есть таблица базы данных, в которой записаны биометрические данные, когда USER ENTER/Leave office, поменяв пальцем по нему.Поиск разницы во времени от разных записей

поля:

USERID EmpName, InOutTime, InOutDate 

теперь, когда пользователь входит в офис, то он записывает

+------+-------+---------+---------+ 
|USERID|EmpName|InOutTime|InOutDate| 
+------+-------+---------+---------+ 
|001 |John |08:30 |12-12-13 | //When user enters office 
+------+-------+---------+---------+ 
|001 |John |04:30 |12-12-13 | //When user leaves office 
+------+-------+---------+---------+ 

Теперь только время изменяется каждый раз, но я хочу, чтобы найти разницу во времени (трудоемкости), с обеих записей и покажите это.

Предупреждение: случайная запись пользователя может быть введена не один раз.

+3

Почему вы хранения даты и времени отдельные LY? Что вы хотите, когда есть строка для начала, но не для времени окончания? Как насчет противоположности? Что, если время охватывает дату? Текущая схема чрезвычайно затрудняет точное представление времени и времени, когда нет ничего, чтобы обеспечить, чтобы оба они существовали, или любые их атрибуты. –

+0

acutally comapny нуждается в этом так –

+0

Я утверждал, но они говорят, что это должно быть так. –

ответ

0

Ваши данные

DECLARE @TABLE TABLE 
(USERID VARCHAR(10),EmpName VARCHAR(10),InOutTime TIME,InOutDate DATE) 
INSERT INTO @TABLE VALUES 
('001','John','08:30','12-12-13'),('001','John','04:30','12-12-13'), 
('002','Sam','05:30','12-12-13'),('002','Sam','04:30','12-12-13') 

Запрос

SELECT t1.EmpName 
     , t1.InOutTime AS InTime 
     , t2.InOutTime AS [TimeOut] 
     , t1.InOutDate AS [DateVisited] 
     , DATEDIFF(HOUR,t1.InOutTime, t2.InOutTime) TotalHours 
FROM @TABLE t1 INNER JOIN @TABLE t2 
ON t1.USERID = t2.USERID 
AND t1.InOutDate = t2.InOutDate 
AND t1.InOutTime < t2.InOutTime 

Результат Набор

╔═════════╦══════════════════╦══════════════════╦═════════════╦════════════╗ 
║ EmpName ║  InTime  ║  TimeOut  ║ DateVisited ║ TotalHours ║ 
╠═════════╬══════════════════╬══════════════════╬═════════════╬════════════╣ 
║ John ║ 04:30:00.0000000 ║ 08:30:00.0000000 ║ 2013-12-12 ║   4 ║ 
║ Sam  ║ 04:30:00.0000000 ║ 05:30:00.0000000 ║ 2013-12-12 ║   1 ║ 
╚═════════╩══════════════════╩══════════════════╩═════════════╩════════════╝ 
+0

спасибо, но у меня есть только одна таблица, у упомянутых 2 таблиц, T1, T2, это смутило меня –

+0

@ user3207757 Я присоединяюсь к таблице для себя, чтобы разделить время и время ожидания –

+0

ok Я не понимаю эту часть: И t1.InOutDate = t2.InOutDate И t1.InOutTime

3

Вот малополезных запрос, чтобы увидеть, как плохо структура данных:

;WITH x AS 
(
    SELECT UserID, EmpName, InOutTime, InOutDate, 
    rn = ROW_NUMBER() OVER (PARTITION BY UserID ORDER BY InOutDate, InOutTime) 
    FROM dbo.tablename 
) 
SELECT *, DATEDIFF(MINUTE, x.InOutTime, y.InOutTime) 
    FROM x LEFT OUTER JOIN x AS y 
    ON x.UserID = y.UserID AND x.rn = y.rn -1; 

Это даст все виды сумасшедших результатов в любом случае, когда отпечатки пальцев не сканировали на выходе. Это то, что вы получаете, когда вы позволяете людям, не работающим с базами данных, проектировать таблицы, я думаю. :-)

Вам действительно нужно пересмотреть дизайн, чтобы исправить проблемы, изложенные в моем комментарии выше.

+0

'WHERE x.rn% 2 = 1', чтобы сделать это немного более полезным. –

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