MS-SQL DATEDIFF GROUP BY显示每个作业代码的小时数

时间:2014-08-08 17:27:40

标签: sql-server sql-server-2008 group-by datediff

我被一些MS SQL工作抛到脑后,我谦卑地请求帮助。我正在学习基础知识但是我的作业远远高于我的技能水平。我被要求提供一个查询,该查询将显示使用我们的时钟数据库为每个作业代码工作了多少小时。以下是该表的示例。

employeeid  Jobcode      TimeIn               TimeOut
18405          4    2014-08-08 06:55:00 2014-08-08 09:14:00
19000          4    2014-08-08 09:27:00 2014-08-08 11:04:00
20205          4    2014-08-08 11:33:00 NULL
18406         13    2014-08-08 06:57:00 2014-08-08 09:01:00
18405         13    2014-08-08 09:16:00 2014-08-08 11:03:00
18406         13    2014-08-08 11:33:00 NULL
18407         19    2014-08-08 08:25:00 2014-08-08 12:03:00
18411         19    2014-08-08 07:59:00 2014-08-08 11:01:00

我想要显示的是运行查询时每个作业代码的总小时数。

 Job Code     Minutes
    1         500
    2         700
    3         200

以下是我使用的查询:

select eh.jobcode,  datediff(mi, eh.TimeIn, isnull(eh.TimeOut, DateAdd(HH,2,Getdate())))   as Minutes

FROM [TimeClockPlus].[dbo].EmployeeHours as eh  inner join 
[TimeClockPlus].    [dbo].employeelist as el ON eh.employeeid = el.employeeid   

WHERE el.department = 'WAREHOUSE' and eh.timein  
>= dateadd(dd, datediff(dd, 0, getdate()), 0)
and eh.timein < dateadd(dd, datediff(dd, 0, getdate()), +1)

Group by  datediff(mi, eh.TimeIn, isnull(eh.TimeOut, DateAdd(HH,2,Getdate()))) , eh.Jobcode

但是我为每个作业代码获取了多行,我是不是正确理解GROUP BY?

按照eh.jobcode&#39;排序的结果示例添加到最后:

jobcode Minutes
   1    69
   1    127
   1    112
   1    24
   1    105
   2    134
   2    53
   2    101
   4    80
   4    9
   4    105
   4    94
   4    129
   4    119
   5    15
   5    103
   5    23
   5    28
   5    33
   5    91

2 个答案:

答案 0 :(得分:0)

您的查询差不多完成了。我相信如果你按照工作代码分组并在日期中添加一笔金额就足够了。如果你希望它看起来很好,你可以在CTE中使用datediff构建你的选择,然后按照你新创建的CTE进行分组和总结。

答案 1 :(得分:0)

在我看来,问题是你有使用相同工作代码的员工ID,这就是你得到重复的原因。为了解决这个问题,我建议您使用datediff(minute函数来获取分钟数,但如果有意义的话,也可以使用select语句中的SUM()函数来计算分数。

如果您无法申请SUM(datediff(minute,请尝试查看:

Sum datediff in minutes with MySQL