【问题标题】:MS-SQL DATEDIFF GROUP BY To show hours for each jobcodeMS-SQL DATEDIFF GROUP BY 显示每个工作代码的小时数
【发布时间】:2014-08-08 17:27:40
【问题描述】:

我被一些 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 吗?

最后添加了“order by eh.jobcode”的结果示例:

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

【问题讨论】:

  • 以下两张海报在技术上都有正确的答案。我只需要对 datediff 进行求和并将其从 group by 中删除。 SELECT eh.jobcode, SUM( 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 &gt;= DATEADD(dd, DATEDIFF(dd, 0, GETDATE()), 0) and eh.timein &lt; DATEADD(dd, DATEDIFF(dd, 0, GETDATE()), +1) GROUP BY eh.Jobcode

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


【解决方案1】:

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

如果你不能申请SUM(datediff(minute,不妨试试这个:

Sum datediff in minutes with MySQL

【讨论】:

  • 当我尝试将 datediff 包装在 sum 中时,它会出错:不能在用于 GROUP BY 子句列表的 group by 表达式中使用聚合或子查询。我将查看该链接并尝试调整我的查询。我还编辑了初始表以显示多个员工使用相同的工作代码。
【解决方案2】:

您的查询即将完成。我相信如果您按作业代码分组并在 datediff 上加上一个总和就足够了。如果您希望它看起来不错,您可以在 CTE 中使用 datediff 构建您的选择,然后对您新创建的 CTE 进行分组和求和。

【讨论】:

  • 感谢您的回复。您是说我应该将选择和分组部分更改为如下所示: SUM(DATEDIFF(mi, eh.TimeIn, ISNULL (eh.TimeOut,GETDATE()))) AS Hours 当我运行它时,错误提示“不正确关键字'FROM'附近的语法。"
猜你喜欢
  • 1970-01-01
  • 2017-08-08
  • 1970-01-01
  • 2021-11-06
  • 1970-01-01
  • 2023-02-21
  • 2011-04-18
  • 2021-08-26
  • 1970-01-01
相关资源
最近更新 更多