2014-01-22 1 views
0

나는이 쿼리를 작성하고 관리하여 dateDiff 함수로 하루에 작업 한 총 시간을 계산합니다. 이제 한 곳에서 멈추었습니다. 나는 사람이 시간이 지남에 따라 새로운 열이 hh : mm로 과도하게 표시되어야한다고 계산하고 싶습니다.초과 작업 시간을 계산할 새 열

본사의 총 근무 시간은 오전 8시이며, 8 시간 초과는 초과 근무 시간으로 간주됩니다. 사람이 8시 35분 시간을 일했다 경우 열은 사람이 근무하고 있음을 보여주는 것보다 0시 35분

QUERY :

출력
with times as (
SELECT t1.EmplID 
     , t3.EmplName 
     , min(t1.RecTime) AS InTime 
     , max(t2.RecTime) AS [TimeOut] 
     , 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] 
       ,CASE 
        WHEN minpart = 0 
         THEN CAST(hourpart AS NVARCHAR(200)) + ':00' 
        WHEN minpart <10 
         THEN CAST(hourpart AS NVARCHAR(200)) + ':0'+ CAST(minpart AS NVARCHAR(200)) 
        ELSE CAST(hourpart AS NVARCHAR(200)) + ':' + CAST(minpart AS NVARCHAR(200)) 

END AS 'total time' 
      FROM (
       SELECT EmplID 
        ,EmplName 
        ,InTime 
        ,[TimeOut] 
        ,[DateVisited] 
        ,DATEDIFF(minute, InTime, [TimeOut])/60 AS hourpart 
        ,DATEDIFF(minute, InTime, [TimeOut]) % 60 AS minpart 
       FROM times 
       ) source 

: 당신은 내가 할 수있는 너무 가까이있어 enter image description here

+0

그냥 의사 코드 : 당신은 당신의'total_time' 및 빼기 걸릴 수 있습니다 그것으로부터 8 :'case when total_time - 8> 0 그 다음 total_time - 8 ELSE 0 end 초과 근무'' – seph

답변

1

대신 시도를 :

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 TimeOutSub - InTimeSub >= '08:01' then 
cast(TimeOutSub - dateadd(hour, 8, InTimeSub) as time) else '00:00' end, 108) as overtime 
FROM times 
+0

오류 : 메시지 8117, 레벨 16, St ate 1, Line 26 피연산자 데이터 유형 char이 빼기 연산자에 유효하지 않습니다. –

+0

은 타임 아웃이 아니며 datetime이 아닙니다. –

+0

Char (5) 실제로 –

1

왜 당신이 문제를 겪고 있는지 보지 마라! case...end as total_time

는 추가 :

, case when hourpart >= 8 then 
      case WHEN minpart = 0 
         THEN CAST((hourpart - 8) AS NVARCHAR(200)) + ':00' 
        WHEN minpart <10 
         THEN CAST((hourpart - 8) AS NVARCHAR(200)) + ':0'+ CAST(minpart AS NVARCHAR(200)) 
        ELSE CAST((hourpart - 8) AS NVARCHAR(200)) + ':' + CAST(minpart AS NVARCHAR(200)) end 
    else '00:00' 
    end as overTime 

건배 -

1
--You can create a separate function to calculate work-hrs and overtime 
-- Try this 

CREATE FUNCTION GetWorkHours (
@INTime AS DATETIME 
,@OutTime AS DATETIME 
,@WorkingHrsINMinutes AS INT 
) 
RETURNS @WorkHours TABLE (
WorkHours VARCHAR(5) 
,OTHours VARCHAR(5) 
) 
AS 
BEGIN 
    INSERT INTO @WorkHours 
    SELECT CAST((DATEDIFF(Minute, @INTime, @OutTime))/60 AS VARCHAR(2)) + ':' +  CAST((DATEDIFF(Minute, @INTime, @OutTime)) % 60 AS VARCHAR(2)) AS TotalTime 
    ,CASE 
     WHEN DATEDIFF(Minute, @INTime, @OutTime) > @WorkingHrsINMinutes 
      THEN CAST((DATEDIFF(Minute, @INTime, @OutTime) -  @WorkingHrsINMinutes)/60 AS VARCHAR(2)) + ':' + CAST((DATEDIFF(Minute, @INTime, @OutTime)  - @WorkingHrsINMinutes) % 60 AS VARCHAR(2)) 
     ELSE '00:00' 
     END AS OverTime 

    RETURN 
END 

--- Sample 
SELECT * 
FROM Dbo.GetWorkHours('2014-01-22 10:00:09.270', '2014-01-22 18:35:09.270', '480') 

SELECT * 
FROM Dbo.GetWorkHours('2014-01-22 10:00:09.270', '2014-01-22 17:35:09.270', '480')