Shm*_*nix 5 sql t-sql sql-server sql-server-2005 sql-server-2008
我有一个存储功能,可以提取所有员工的时钟信息.我正试图提出一份例外报告来审核午餐.我当前的查询一次构建所有信息1段.
SELECT ftc.lEmployeeID, ftc.sFirstName, ftc.sLastName, ftc.dtTimeIn,
ftc.dtTimeOut, ftc.TotalHours, ftc.PunchedIn, ftc.Edited
FROM dbo.fTimeCard(@StartDate, @EndDate, @DeptList,
@iActive, @EmployeeList) AS ftc
LEFT OUTER JOIN Employees AS e ON ftc.lEmployeeID = e.lEmployeeID
WHERE (ftc.TotalHours >= 0) AND (ftc.DID IS NOT NULL) OR
(ftc.DID IS NOT NULL) AND (ftc.dtTimeOut IS NULL)
Run Code Online (Sandbox Code Playgroud)
这个输出看起来像这样:
24 Bob bibby 8/2/2013 11:55:23 AM 8/2/2013 3:36:44 PM 3.68
24 bob bibby 8/2/2013 4:10:46 PM 8/2/2013 8:14:30 PM 4.07
39 rob blah 8/2/2013 8:01:57 AM 8/2/2013 5:01:40 PM 9.01
41 john doe 8/2/2013 10:09:58 AM 8/2/2013 1:33:38 PM 3.4
41 john doe 8/2/2013 1:55:56 PM 8/2/2013 6:10:15 PM 4.25
Run Code Online (Sandbox Code Playgroud)
我需要查询来做两件事.
1)将每个段组合在一起.2)在新的列中报告"休息时间"
获得该信息后,我需要检查每个细分的小时数,并确保发生两件事.
1)如果他们共工作了6个小时,他们是否会休息30分钟?2)如果他们休息一下,他们会休息> 30分钟.
你看到鲍勃在上午11点55分打了一拳,并在3点36分打了一顿午餐.他于4点10分午餐时冲了上来,并于8点14分拳打脚踢.他共工作了7.75小时,并且休息了34分钟.他在这里很好.而且我不想报告例外情况
约翰总共工作了7.65个小时.然而,当他拳打脚踢时,他只吃了22分钟的午餐.我需要报告"吉姆只吃了22分钟的午餐"
你也会看到抢劫工作了9个小时,没有休息.我需要报告"抢劫工作超过6小时且没有休息"
我想如果我能完成对2段的分组.然后我可以处理报告方面.
*更新**
我更改了查询以尝试完成此操作.以下是我当前的查询:
SELECT ftc.lEmployeeID, ftc.sFirstName, ftc.sLastName, ftc.TotalHours, DATEDIFF(mi, MIN(ftc.dtTimeOut), MAX(ftc.dtTimeIn)) AS Break_Time_Minutes
FROM dbo.fTimeCard(@StartDate, @EndDate, @DeptList, @iActive, @EmployeeList) AS ftc LEFT OUTER JOIN
Employees AS e ON ftc.lEmployeeID = e.lEmployeeID
WHERE (ftc.TotalHours >= 0) AND (ftc.DID IS NOT NULL) OR
(ftc.DID IS NOT NULL) AND (ftc.dtTimeOut IS NULL)
GROUP BY ftc.lEmployeeID, ftc.sFirstName, ftc.sLastName, ftc.TotalHours
Run Code Online (Sandbox Code Playgroud)
我的输出目前看起来像这样:
24 Bob bibby 3.68 -221
24 bob bibby 4.07 -244
39 rob blah 0.05 -3
39 rob blah 2.63 -158
41 john doe 3.4 -204
41 john doe 4.25 -255
Run Code Online (Sandbox Code Playgroud)
正如您所看到的那样,它没有按日期组合细分,而Break_time显示为负分钟.它也没有结合日子.鲍勃的时间应该在1行.并显示7.75分钟的休息时间应为34分钟.
我相信,如果你想合并两次,你需要将它们从组中取出,然后将它们相加。根据结果,报告可以检查总时间和休息时间。如果您想标记它们,可以添加 case 语句。
SELECT ftc.lEmployeeID
,ftc.sFirstName
,ftc.sLastName
,SUM(ftc.TotalHours) AS TotalHours
,DATEDIFF(mi, MIN(ftc.dtTimeOut), MAX(ftc.dtTimeIn)) AS BreakTimeMinutes
FROM dbo.fTimeCard(@StartDate, @EndDate,
@DeptList, @iActive,@ EmployeeList) AS ftc
WHERE SUM(ftc.TotalHours) >= 0 AND (ftc.DID IS NOT NULL) OR
(ftc.DID IS NOT NULL) AND (ftc.dtTimeOut IS NULL)
GROUP BY ftc.lEmployeeID, ftc.sFirstName, ftc.sLastName
Run Code Online (Sandbox Code Playgroud)
我在 sql 中做了这个快速测试,它似乎按照你想要的方式工作。您是否向群组添加了一些内容?
declare @table table (emp_id int,name varchar(4), tin time,tout time);
insert into @table
VALUES (1,'d','8:30:00','11:35:00'),
(1,'d','13:00:00','17:00:00');
SELECT t.emp_id
,t.name
,SUM(DATEDIFF(mi, tin,tout))/60 as hours
,DATEDIFF(mi, MIN(tout), MAX(tin)) AS BreakTimeMinutes
FROM @table t
GROUP BY t.emp_id, t.name
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2106 次 |
| 最近记录: |