2014-01-27 37 views
0

我已经写了这个查询来显示加班时间,如果人员的工作时间超过了18:00时钟时间,无论他/她来了什么时间或工作的持续时间,这是超出主题。它只显示OVERTIME是否已经在18:00 pm以上工作过,例如InTime = 15:16 pm和TimeOut = 18:31然后加班= 00:31。因此,我写了下面给出的这个查询,但现在的问题是几个雇员在17:00 pm离开,他们的超时应该在17:00 pm之后计算(他只在17:00 pm以上工作了多少分钟+小时),所以这些特定员工加班费应为计算出来后被下午17:00显示特定人员的结果

的那些雇员:

EmplID 5, 43, 11 

所以只有这些加班应在17:00之后进行计算。

查询:

with times as (
SELECT t1.EmplID 
     , t3.EmplName 
     , min(t1.RecTime) AS InTime 
     , max(t2.RecTime) AS [TimeOut] 
     , cast(min(t1.RecTime) as datetime) AS InTimeSub 
     , cast(max(t2.RecTime) as datetime) AS TimeOutSub 
     , t1.RecDate AS [DateVisited] 
FROM AtdRecord t1 
INNER JOIN 
     AtdRecord t2 
ON t1.EmplID = t2.EmplID 
AND t1.RecDate = t2.RecDate 
AND t1.RecTime < t2.RecTime 
inner join 
     HrEmployee t3 
ON t3.EmplID = t1.EmplID 
group by 
      t1.EmplID 
     , t3.EmplName 
     , t1.RecDate 
) 
SELECT EmplID 
,EmplName 
,InTime 
,[TimeOut] 
,[DateVisited] 
,convert(char(5),cast([TimeOutSub] - InTimeSub as time), 108) totaltime 
,CONVERT(char(5),CASE WHEN CAST([TimeOutSub] AS DATETIME) >= '18:00' Then  
LEFT(CONVERT(varchar(12), DATEADD(ms, DATEDIFF(ms, CAST('18:00' AS DATETIME), 
CAST([TimeOutSub] AS DATETIME)),0), 108),5) ELSE '00:00' END, 108) AS OVERTIME 
FROM times 

OUTPUT:

enter image description here

回答

1

尝试更换:

CASE WHEN CAST([TimeOutSub] AS DATETIME) >= '18:00' Then  
LEFT(CONVERT(varchar(12), DATEADD(ms, DATEDIFF(ms, CAST('18:00' AS DATETIME), 
CAST([TimeOutSub] AS DATETIME)),0), 108),5) ELSE '00:00' END, 108) AS OVERTIME 

随着

CASE WHEN CAST([TimeOutSub] AS DATETIME) >= '18:00' And EmplId Not In (5,43,11) 
    Then LEFT(CONVERT(varchar(12), DATEADD(ms, DATEDIFF(ms, CAST('18:00' AS DATETIME), CAST([TimeOutSub] AS DATETIME)),0), 108),5) 
    WHEN CAST([TimeOutSub] AS DATETIME) >= '17:00' And EmplId In (5,43,11) 
    Then LEFT(CONVERT(varchar(12), DATEADD(ms, DATEDIFF(ms, CAST('17:00' AS DATETIME), CAST([TimeOutSub] AS DATETIME)),0), 108),5) 
    ELSE '00:00' END, 108) AS OVERTIME 

基本上,我只是在WHEN部分放置了多个条件。 When time > 18:00emplid not IN (5,43,11),然后time > 17:00 and emplid in (5,43,11).

可能更容易理解这是伪代码中的另一个条件:

CASE WHEN TIME >= '18:00' And EmplId Not In (5,43,11) 
    Then -- Calculate overtime at 18:00 
    WHEN TIME >= '17:00' And EmplId In (5,43,11) 
    Then -- Calculate overtime at 17:00 
    ELSE '00:00' 
    END OVERTIME 
+0

OK先生,还是让我试试这个,然后 –

+0

非常感谢主席先生,大 –