如何总结SQL Server 2008中类似员工的时间值

如何总结SQL Server 2008中类似员工的时间值,sql,sql-server-2008,Sql,Sql Server 2008,我有三张桌子 员工:员工ID、员工姓名 EmployeeTimeIn:EID、时间、日期、州标志、消费小时数 员工超时:EID、超时、日期、状态标志 我附上了这些包含样本数据的表格的图片 我需要写一个查询,它将列出所有员工的id、姓名和他们花费的总时间。为此,我需要总结每个员工的时间价值。我编写了这个查询,其中列出了timein和timeout表中列出的所有员工: select e.EmployeeID, e.EmployeeName, e1.HoursConsumed from Emplo

我有三张桌子

  • 员工
    员工ID、员工姓名
  • EmployeeTimeIn
    EID、时间、日期、州标志、消费小时数
  • 员工超时
    EID、超时、日期、状态标志
我附上了这些包含样本数据的表格的图片

我需要写一个查询,它将列出所有员工的id、姓名和他们花费的总时间。为此,我需要总结每个员工的时间价值。我编写了这个查询,其中列出了timein和timeout表中列出的所有员工:

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;
hourscomped
是一个时间字段。有什么想法吗


现在您已经将分组字段设置为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
根据求和的准确性,可以使用不同的时间单位。时间精确到100纳秒(默认情况下,最好是100纳秒),因此使用
ns
可以保持绝对精确性,但更可能因大量数据而溢出:)

如果需要将其转换回时间,可以使用以下方法:

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

如果按e.EmployeeID添加
分组,e.EmployeeName
是否有效?它显示了此错误:文本、ntext和图像数据类型无法进行比较或排序,除非使用IS NULL或LIKE运算符。是否已将EmployeeName定义为文本或ntext?似乎您对
EmployeeName
使用了错误的数据类型。例如,您应该使用
varchar(50)
nvarchar(50)
而不是不推荐使用的大型对象数据类型。是的,名称数据类型是text,现在我将其更改为varchar(50)。现在显示此错误:操作数数据类型time对于sum运算符无效。这引发溢出错误:Msg 535,级别16,状态0,第4行datediff函数导致溢出。分隔两个日期/时间实例的DatePart数量太多。尝试将datediff与不太精确的datepart一起使用。使用
NS
您最多可以计算相隔两秒的时间戳之间的差异
MS
可能就足够了,从OP的例子来看,它甚至可能是
s
。经过深入研究,我发现为了解决这个问题,我需要编写非常复杂的t-SQL脚本。所以我把HoursConsumed的数据类型改为integer,现在我可以使用SUM函数了。感谢您的快速回复。