2012-02-11 36 views
0

我有三个表如何总结类似员工的时间值在SQL Server 2008中

  • 员工EmployeeID, EmployeeName
  • EmployeeTimeInEID, Time_In, Date_Ref, State_Flag, HoursConsumed
  • EmployeeTimeOutEID, Time_Out, Date_Ref, State_Flag

我附上了包含样本数据的这些表格的图像。

我需要编写一个查询,列出所有员工的ID,姓名和他们消费的总时间。为此我需要总结每位员工的时间价值。我写此查询,其中列出它们在timein和超时表中列出的所有员工:

select e.EmployeeID, e.EmployeeName, e1.HoursConsumed 
from EmployeeTimeIn as e1, Employee as e 
where e1.EID = e.EmployeeID; 

我想要做这样的事情:

select e.EmployeeID, e.EmployeeName, SUM(e1.HoursConsumed) 
from EmployeeTimeIn as e1, Employee as e 
where e1.EID = e.EmployeeID; 

HoursConsumed是一个时间字段。有任何想法吗?

Employee Tables

+0

如果添加“GROUP BY e.EmployeeID,e.EmployeeName'不起作用? – SQLMenace 2012-02-11 17:30:00

+0

它显示此错误: 除非使用IS NULL或LIKE运算符,否则不能比较或排序文本,ntext和图像数据类型。 – Azeem 2012-02-11 17:36:51

+0

您是否将EmployeeName定义为文本或ntext? – 2012-02-11 17:51:48

回答

0

现在,你有你的分组字段为varchar()或类似的类型,你可以做这样的事情......

select e.EmployeeID, e.EmployeeName, SUM(DATEDIFF(ns, 0, e1.HoursConsumed)) 
from EmployeeTimeIn as e1, Employee as e 
where e1.EID = e.EmployeeID; 
group by e.EmployeeID, e.EmployeeName 

根据的准确性你总结什么,你可能会使用不同的时间单位。 TIME精确到100ns(默认情况下,最好),所以使用ns可以保持绝对的准确性,但在大量数据时更容易溢出:)

如果您需要将其转换回一次,可以使用类似的东西:

DATEADD(ns, SUM(DATEDIFF(ns, 0, e1.HoursConsumed)), 0) 
+0

这会引发溢出错误: 消息535,级别16,状态0,行4 datediff函数导致溢出。分隔两个日期/时间实例的日期部分数量太大。尝试使用不精确的日期部分的datediff。 – Azeem 2012-02-11 18:52:55

+0

使用'NS',您可以计算最多相隔两秒钟的时间戳之间的差异! 'MS'可能就够了,从OP的例子来看,它甚至可能是'S'。 – 2012-02-11 19:34:20

+0

经过深入研究后,我发现为了解决这个问题,我需要编写非常复杂的t-SQL脚本。所以我改变了HoursConsumed的数据类型为整数,现在我可以使用SUM函数。 感谢您的快速回复。 – Azeem 2012-02-12 08:06:46