2013-12-19 2 views
0

나는 끌어 오기가 정보에서 직원 펀치를 잡아내는 함수를 실행하는 쿼리가 있습니다. 그것은 특정 일을 위해 그들을 결합, 시간 세그먼트를 끌어, 그들은 확인하기 위해 검사를 실행 30 분 미만중단 시간에 차이를 찾기위한 Datediff

다음은 휴식을했다 그 날 2) 휴식을 취하지 않았다

1) 이 부분의 첫 부분은 올바르게 작동합니다. 휴식을 취하지 않은 주 7 명 (모두 0 분 휴식)을 표시합니다. 그러나 단 22 분만 휴식 한 사용자는 표시되지 않습니다. 무슨 일이 일어나고 있는지, 특정 날짜의 모든 시간 정보를 완전히 결합하지 못하고 있다고 생각합니다. 휴식을 취하지 않은 사람들을위한 정보 만 결합합니다. 어떤 도움이 필요합니까?

내 쿼리는 다음과 같습니다

SELECT  lEmployeeID, NUM_Hours, CASE WHEN tmp.Break_Time_Minutes < 0 THEN 0 ELSE Break_Time_Minutes END AS Break_Time_Minutes, 
         CASE WHEN tmp.Break_Time_Minutes < 0 THEN 1 ELSE 0 END AS SkippedBreak, sFirstName, sLastName, TotalHours 
FROM   (SELECT  employee.lEmployeeID, employee.sFirstName, employee.sLastName, employee.TotalHours, ROUND(SUM(DATEDIFF(second, employee.dtTimeIn, 
                employee.dtTimeOut)/60.0/60.0), 1) AS NUM_Hours, DATEDIFF(mi, MIN(employee.dtTimeOut), MAX(employee.dtTimeIn)) AS Break_Time_Minutes 
          FROM   dbo.fTimeCard(@StartDate, @EndDate, @DeptList, @iActive, @EmployeeList) AS employee LEFT OUTER JOIN 
                Employees AS e ON employee.lEmployeeID = e.lEmployeeID 
          WHERE  (employee.TotalHours >= 0) AND (employee.DID IS NOT NULL) OR 
                (employee.DID IS NOT NULL) AND (employee.dtTimeOut IS NULL) 
          GROUP BY employee.lEmployeeID, employee.sLastName, employee.sFirstName, employee.TotalHours, CAST(employee.dtTimeIn AS Datetime)) AS tmp 
WHERE  (NUM_Hours > 6) AND (Break_Time_Minutes < 30) 
+0

쿼리 내가 당신의 대한 기존 쿼리 (마지막 게시물)의에 제안 마지막 게시물을 complicated.in 않은이 켜지지입니다 datediff를 사용하여 동일한 쿼리에서 하나 이상의 열을 만들고 .do same now.no는 group by 또는 sum을 필요로하지 않습니다. – KumarHarsh

+0

나는 세그먼트를 결합해야합니다 ... 나는 단지 하나를 취하지 않은 사람들을 포함하여 30 분 미만의 휴식을 취한 사람들을보고하고자합니다. 또한 적절한 휴식을 취하지 않고 작업 한 총 시간을보고해야합니다. – Shmewnix

+0

먼저 동일한 쿼리에서 동일한 쿼리에서 하나의 열을 더 만든 다음이 GROUP BY employee.lEmployeeID only.thatswhy를 사용하여 작업 및 합계 작업을 결합해야합니다. 단순한 마지막 글 목록을 보여주십시오. – KumarHarsh

답변

0

쿼리를 포맷하면 내가 그것을 이해하는 데 도움이됩니다.

문제는 휴식 시간 계산에있는 것 같습니다. 이 두 계산 방법은 모두 정확합니까?

  ROUND(SUM(DATEDIFF(second, employee.dtTimeIn, 
          employee.dtTimeOut)/60.0/60.0), 1) AS NUM_Hours, 
     DATEDIFF(mi, MIN(employee.dtTimeIn), MAX(employee.dtTimeOut) 
       ) AS Break_Time_Minutes 

두 번째는 중단 시간을 시간의 최소 및 최대 시간으로 계산합니다. 아마도이 시간은 직원이있는 총 시간입니다.

아마도 당신은 의미 :

 MIN(DATEDIFF(mi, employee.dtTimeIn, employee.dtTimeOut) 
     ) AS Break_Time_Minutes 

전체 포맷 쿼리는 다음과 같습니다

SELECT lEmployeeID, NUM_Hours, 
     (CASE WHEN tmp.Break_Time_Minutes < 0 THEN 0 ELSE Break_Time_Minutes 
     END) AS Break_Time_Minutes, 
     (CASE WHEN tmp.Break_Time_Minutes < 0 THEN 1 ELSE 0 
     END) AS SkippedBreak, 
     sFirstName, sLastName, TotalHours 
FROM (SELECT employee.lEmployeeID, employee.sFirstName, employee.sLastName, 
      employee.TotalHours, 
      ROUND(SUM(DATEDIFF(second, employee.dtTimeIn, 
           employee.dtTimeOut)/60.0/60.0), 1) AS NUM_Hours, 
      DATEDIFF(mi, MIN(employee.dtTimeIn), MAX(employee.dtTimeOut) 
        ) AS Break_Time_Minutes 
     FROM dbo.fTimeCard(@StartDate, @EndDate, @DeptList, @iActive, @EmployeeList 
         ) employee LEFT OUTER JOIN 
      Employees e 
      ON employee.lEmployeeID = e.lEmployeeID 
     WHERE (employee.TotalHours >= 0) AND (employee.DID IS NOT NULL) OR 
      (employee.DID IS NOT NULL) AND (employee.dtTimeOut IS NULL) 
     GROUP BY employee.lEmployeeID, employee.sLastName, employee.sFirstName, 
       employee.TotalHours, CAST(employee.dtTimeIn AS Datetime) 
    ) tmp 
WHERE (NUM_Hours > 6) AND (Break_Time_Minutes < 30) 
+0

내장 함수 이름이 아닌 "MINDATEDIFF"가 작동하지 않았습니다. – Shmewnix

+0

'min (datediff (...))'이어야합니다. –

+0

또한 원본 게시물부터 쿼리를 변경 했으므로이 부분을 역으로 수정했습니다. 나는 최소 시간을 가져 와서 최대 시간 (이 시간은 그들이 휴식을 취한 것으로 가정)에서 빼야합니다. 예를 들어. 오전 7시에 펀치를 꽂으면 오전 11시 22 분에 휴식을 취한 다음 오전 11시 22 분에 다시 휴식을 취합니다. 그 수학을 수행하고 예외를보고해야합니다. – Shmewnix