2014-01-26 2 views
0

사무실 시간 : 오전 10:00 - 오후 18:00.테이블의 초과 열

사람이 '8 시간 이상'근무한 경우 초과 근무를 표시하기 위해이 쿼리를 작성했습니다. 그가 초과 근무 시간보다 '08 : 44 시간 '을 수행했다면 00:44로 표시되지만 지금은이를 원하지 않습니다.

나는 이것을 TOTAL WORK TIME을 기준으로 계산하고 싶지 않습니다. 나는 사람이 시계 시간보다 18:00 이상 일한 적이 있으면 초과 근무 시간을 표시해야한다.

오후 10시 50 분부터 오후 8시 33 분까지 근무한 사람이 초과 근무 시간보다 00:33을 표시해야합니다. 사람이 오후 18시 이상 근무한 경우에만 초과 근무를 계산해야합니다.

n.b. 실제로, 우리의 사무실 정책은 초과 근무 시간에 대해 직원에게 돈을 지불하는 것입니다. 따라서 직원이 오후 17:00에 사무실에 도착하여 오후 18:54까지 근무 했더라도 시간이 오후 18:00 이상인 초과 근무를 계산할 수 있습니다. 초과 근무 수당 54 분을 지불해야하며, 그 외에는 근무 시간을 지불하지 않으면 급여에서 공감할 수 있지만 초과 근무 수당에도 적용됩니다.

WITH Times AS 
( SELECT emp.EmplID, 
      emp.EmplName, 
      InTime = MIN(atd.RecTime), 
      OutTime = MAX(atd.RecTime), 
      TimeWorked = DATEDIFF(MINUTE, MIN(atd.RecTime), MAX(atd.RecTime)), 
      OverTime = DATEDIFF(MINUTE, MIN(atd.RecTime), MAX(atd.RecTime)) - 480, 
      [DateVisited] = atd.RecDate 
    FROM AtdRecord atd 
      INNER JOIN HrEmployee emp 
       ON atd.EmplID = emp.EmplID 
    GROUP BY emp.EmplID, emp.EmplName, atd.RecDate 
    HAVING COUNT(atd.RecTime) > 1 
) 
SELECT t.EmplID, 
     t.EmplName, 
     t.InTime, 
     t.OutTime, 
     t.DateVisited,  
     TimeWorked = CONVERT(CHAR(5), DATEADD(MINUTE, t.TimeWorked, 0), 8), 
     OverTime = CASE WHEN t.OverTime < 0 THEN '-' ELSE '' END + 
           CONVERT(CHAR(5), DATEADD(MINUTE, ABS(t.OverTime), 0), 8) 
FROM Times t 
+0

대문자와 뚜렷한 글꼴은 질문의 명확성을 높이기 위해 제거되었으며 대개 소리/악성 네티켓으로 간주됩니다. –

답변

0

이것은 논리입니까?

DECLARE @EndTimeA TIME = '18:00', 
     @EndTimeB TIME = '18:05', 
     @EndTimeC TIME = '19:00', 
     @EndTimeD TIME = '17:55' 


SELECT OvertimeMM_A = CASE WHEN @EndTimeA > '18:00' THEN DATEDIFF(MINUTE, '18:00', @EndTimeA) 
           ELSE 0 
          END 
     ,OvertimeMM_B = CASE WHEN @EndTimeB > '18:00' THEN DATEDIFF(MINUTE, '18:00', @EndTimeB) 
           ELSE 0 
          END 
     ,OvertimeMM_C = CASE WHEN @EndTimeC > '18:00' THEN DATEDIFF(MINUTE, '18:00', @EndTimeC) 
           ELSE 0 
          END 
     ,OvertimeMM_D = CASE WHEN @EndTimeD > '18:00' THEN DATEDIFF(MINUTE, '18:00', @EndTimeD) 
           ELSE 0 
          END 

TIME;

DECLARE @EndTimeA TIME = '18:00', 
     @EndTimeB TIME = '18:05', 
     @EndTimeC TIME = '19:00', 
     @EndTimeD TIME = '17:55' 


SELECT CONVERT(CHAR(5), DATEADD(MINUTE, OvertimeMM_A, '00:00'), 8) 
     ,CONVERT(CHAR(5), DATEADD(MINUTE, OvertimeMM_B, '00:00'), 8) 
     ,CONVERT(CHAR(5), DATEADD(MINUTE, OvertimeMM_C, '00:00'), 8) 
     ,CONVERT(CHAR(5), DATEADD(MINUTE, OvertimeMM_D, '00:00'), 8) 
FROM 
(
    SELECT OvertimeMM_A = CASE WHEN @EndTimeA > '18:00' THEN DATEDIFF(MINUTE, '18:00', @EndTimeA) 
            ELSE 0 
           END 
      ,OvertimeMM_B = CASE WHEN @EndTimeB > '18:00' THEN DATEDIFF(MINUTE, '18:00', @EndTimeB) 
            ELSE 0 
           END 
      ,OvertimeMM_C = CASE WHEN @EndTimeC > '18:00' THEN DATEDIFF(MINUTE, '18:00', @EndTimeC) 
            ELSE 0 
           END 
      ,OvertimeMM_D = CASE WHEN @EndTimeD > '18:00' THEN DATEDIFF(MINUTE, '18:00', @EndTimeD) 
            ELSE 0 
           END 
)DT 
+0

사람이 사무실에 들어오는 시간을 봅니다. 다른 이야기가 있습니다. 내가 원하는 것은 사람이 오후 18시를 넘으면 그 시간이 초과 근무 열에 표시되어야합니다. 그렇지 않은 경우 –

+0

설명해 주시겠습니까? 제공된 코드가 방금 설명한 논리를 수행하지 못합니까? – MarkD

+0

Sok lemme test 이것들은 단지 wt가 diff와 btw 두 가지 쿼리라는 것을 말해 줍니까? 둘 다 실행해야합니까 –