2014-01-27 5 views
0

Я написал этот запрос, чтобы показать сверхурочное время, если человек работал выше 18:00 часов, независимо от времени, в которое он пришел, или продолжительности работы, с которой он/она работал, что не соответствует теме , Он показывает только OVERTIME, если человек работал выше 18:00 вечера, то есть, например InTime = 15:16 pm и TimeOut = 18:31, а затем Overtime = 00:31. Таким образом, я написал этот запрос, приведенный ниже. НО ТЕПЕРЬ ПРОБЛЕМА - ЧТО СЛУЧАЙНЫЕ СОТРУДНИКИ ОСТАВЛЯЮТСЯ В 17:00, а их ПЕРЕДАЧА следует рассчитать после 17:00 (сколько минут + часов он работал только до 17:00), SO FOR эТИ ОСОБЫЕ сОТРУДНИКИ сВЕРХУРОЧНАЯ дОЛЖНО рАССЧИТАНЫ пОСЛЕ 17:00 PmОтображение результатов для конкретного человека

эти сотрудники:

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 

ВЫВОД:

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:00 и emplid 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

ОК сэр, Лемм попробовать это, то –

+0

Большое спасибо, сэр, Большой –

Смежные вопросы