2014-01-16 4 views
-3

나는 다음과 같은 테이블이 있습니다 - 내가하고자계산 정상 근무 시간 및 초과 근무

TableA의 (공휴일)

enter image description here

TableB의 (표)

enter image description here

을 특정 조건을 가진 각 직원에 대해 정상 근무 시간을 초과 근무 시간으로 계산합니다 (&). SQL 서버. 예상 출력은 다음과 같이해야한다 : -

enter image description here

조건은 다음과 같다 : -

일 시프트를 들어

월요일 - 금요일 : 8 시간까지 정상으로 간주됩니다. 8 시간 이상은 OT15로 간주됩니다. 토요일 : 최대 4 시간이 정상으로 간주됩니다. 4 시간 이상은 OT15로 간주됩니다. 일요일 & 공휴일 : OT20

간주됩니다

부문 FEP : 사무실 시작 시간 오전 8시

(계산 목적을 위해, 시작이다 : 공식 시작 시간은 오전 7시 반

부문 SER은 시간은 야근을 위해 직원이 훨씬 이전에 도착하는 경우에도 분할 공식 시작 시간)

을 기반으로

월요일 - 금요일 : 최대 8 시간이 정상으로 간주됩니다. 8 시간 이상은 OT15로 간주됩니다. 토요일 : 최대 4 시간이 정상으로 간주됩니다. 4 시간 이상은 OT15로 간주됩니다. 일요일 & 공휴일 : OT20

간주됩니다

부문 FEP : 사무실 시작 시간, 모든 국민이 외에도 오후 8시

입니다 : 공식 시작 시간은 오후 7시 반

부문 SER은 공휴일은 일하는 사람들을 위해 일하지 않는 사람들을 위해 정상적으로 일하는 8 시간으로 간주 될 것이며, 그들은 OT20으로 취급 될 것입니다.

감사합니다.

+0

당신의 텍스트 부문'FEL'와'SER'을 가지고 있지만 사진이 SER'은''부문을 가지고 KEP'과 -의 공식 시작 시간 것입니다 'KEP' (또는 'FEL'이나'SER'이 아닌 부서의 기본값이 있습니까?) –

+1

질문 자체에 대한 명백한 시도는 없습니다. 함께 작업 할 코드가 없습니다. –

+0

또한 한 시간 미만이거나 'X.Y'시간이 근무한 시간을 처리하는 방법은 무엇입니까? 가장 가까운 분기 시간 (반올림, 반올림, 은행가 라운드, 다른 것)으로 반올림하여 그대로 취급 하시겠습니까? –

답변

1

부분으로 브레이크를 아래로하고를 반복 :

-- To start with, we need to know how long someone actually worked 
-- for each period, so let's calculate that: 
;WITH EmployeeTimecardData AS 
    (
    SELECT TS.[Date] AS [Period], 
     TS.Employee AS [EmployeeID], 
     SUM(DATEDIFF(MINUTE, TS.TimeIn, TS.TimeOut)) as [Time Worked], 
     MAX(TS.[Day]) AS [DW] 
    FROM Timesheet TS 
    GROUP BY TS.[Date], TS.Employee 
    ), 
-- Then, there is some rounding that needs to be done, 
-- (there is probably a better way to do this, but you get the idea) 
EmployeeTimecards AS 
    (
    SELECT ETD.[Perid], 
     ETD.EmployeeID, 
     CASE 
     WHEN ROUND(ETD.[Time Worked], 1) % 10 > 0.5 
      THEN CEILING(ETD.[Time Worked]) 
     WHEN ROUND(ETD.[Time Worked], 1) % 10 < 0.5 
      THEN FLOOR(ETD.[Time Worked]) 
     ELSE 
      ROUND(ETD.[Time Worked], 1) 
     END AS [Time Worked], 
     ETD.DW 
    FROM EmployeeTimecardData AS [ETD] 
    ) 
-- Now that we have the data in the shape we want it, 
-- we can start our calculations 
SELECT [ET].Period, 
    [ET].EmloyeeID, 
    CASE 
    WHEN NHL.[Date] IS NOT NULL OR ET.DW = 'SUN' 
     THEN 0 
    WHEN ET.DW = 'SAT' 
     THEN 
      CASE 
      WHEN ET.[Time Worked] > 4 
       THEN 4 
      ELSE 
       ET.[Time Worked] 
      END 
    ELSE 
     CASE 
     WHEN ET.[Time Worked] > 8 
      THEN 8 
     ELSE 
      ET.[Time Worked] 
     END 
    END AS [Normal], 
-- OT15 and OT20 are left as an exercise for the reader :-) 
FROM EmployeeTimecards AS [ET] 
LEFT OUTER JOIN NationalHoliday [NHL] 
    ON [ET].[Period] = [NHL].[Date] 
+0

위의 내용은 해당 부서의 공식 시작 시간 (KEP의 경우 7.30, SER의 경우 8.00)을 고려하지 않습니다. 그것을 포함 할 수 있습니까? – Bob

+0

@Bob - 주어진 스키마로 어떤 직원이 들어 왔는지를 알 수있는 방법이 없습니다. (예를 들어 오후 2시에 오는 직원이 저녁 시간대로 5.5 시간 * 일찍 도착하거나 오전 8시 30 분 * 늦은 오후에?) –

+0

나는 그것을 실행했고 몇 가지 문제가 특히 늦은 오후부터 다음날 오전에 시작됩니다. 예를 들어, 20131231 18:38에 시작하여 20140101 6:30에 완료했습니다. 시스템은 -932로 계산했습니다. – Bob