2014-01-19 77 views
1

我有数据库表记录生物识别数据,当用户输入/离开办公室通过交换手指。查找来自不同记录的时差

领域:

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我加入桌子本身分开银泰和outtime –

+0

好吧我不明白这个部分:AND t1.InOutDate = t2.InOutDate AND 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',使这个稍微有用。 –