2014-02-05 3 views
-1

나는이 쿼리를 작성하여 특정 날짜에 직원의 총 근무 시간과 초과 근무 시간 (해당 직원이있는 경우)을 표시합니다. 나는 특정 날짜에 사람의 INtime과 OutTime이 비어 있다면 자신의 intime, outtime, totalworkingtime, 초과 작업 시간에 00:00을 넣고 싶습니다. 일요일에 InTime과 OutTime이 없으므로 시간 열에 00:00을 표시해야합니다. 참고 : 날짜는 InTIme 개인이 언급 된 경우에만 입력되며 그렇지 않으면 DateVisited가 없습니다.다른 열의 데이터 계산

EmplID EmplName ShiftID intime Outtime totalworking overtime dateVisited 
0000001 John  S001 00:00 00:00 00:00:  00:00  2013-12-01 

쿼리 :

귀하의 케이스를 들어
WITH times 
      AS (SELECT t1.EmplID 
        ,t3.EmplName 
        ,MIN(t1.RecTime) AS InTime 
        ,MAX(t2.RecTime) AS [TimeOut] 
        ,t4.ShiftId AS ShiftID 
        ,t4.StAtdTime AS ShStartTime 
        ,t4.EndAtdTime AS ShEndTime 
        ,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 
       INNER JOIN AtdShiftSect t4 
        ON t3.ShiftId = t4.ShiftId 
       GROUP BY t1.EmplID 
        ,t3.EmplName 
        ,t1.RecDate 
        ,t4.ShiftId 
        ,t4.StAtdTime 
        ,t4.EndAtdTime) 
    SELECT EmplID 
      ,EmplName 
      ,ShiftId AS ShiftID 
      ,InTime 
      ,[TimeOut] 
      ,CONVERT(CHAR(5), CAST([TimeOutSub] - InTimeSub AS TIME), 108) TotalWorkingTime 
      ,[DateVisited] 
      ,CASE WHEN [InTime] IS NOT NULL 
         AND [TimeOut] IS NOT NULL 
       THEN CONVERT(CHAR(5), CASE WHEN CAST([TimeOutSub] AS DATETIME) >= ShEndTime 
               AND ShiftID = 'S002' 
              THEN LEFT(CONVERT(VARCHAR(12), DATEADD(ms, 
                        DATEDIFF(ms, 
                          CAST(ShEndTime AS DATETIME), 
                          CAST([TimeOutSub] AS DATETIME)), 
                        0), 108), 5) 
              WHEN CAST([TimeOutSub] AS DATETIME) >= ShEndTime 
               AND ShiftID = 'S001' 
              THEN LEFT(CONVERT(VARCHAR(12), DATEADD(ms, 
                        DATEDIFF(ms, 
                          CAST(ShEndTime AS DATETIME), 
                          CAST([TimeOutSub] AS DATETIME)), 
                        0), 108), 5) 
              ELSE '00:00' 
             END, 108) 
       ELSE 'ABSENT' 
      END AS OverTime 
     FROM times 
     ORDER BY EmplID 
      ,ShiftID 
      ,DateVisited 
+0

질문을 명확히 할 수 있습니까? 네가 묻고있는 게 뭔지 잘 모르겠다. –

+0

예 : 당신은 종업원이며 일요일이나 공휴일에 오지 않으면 이드와 매 등이 나타나야 만하지만 시간은 00:00이어야합니다. 그 날의 데이터가 없음을 의미합니다. – PreciseTech

+0

사람의 시간 만 언급 할 때 날짜가 입력되었습니다. 나는 생물, etric 장치에서 실제로 그것을 얻고있다. INTIME then datevisited는 피드가되지만 문제는 사람이 부재중 인 경우 InTime이없고 방문한 날짜가 없으므로 확인할 방법이 – PreciseTech

답변

0

,이 작업을 수행하는 가장 좋은 방법은 당신에게 분수 계산 분을 줄 것이다 테이블을 만드는 것입니다. 예를 들어

: 1 분 = 0.02 시간, 40 분 =이 후 0.67 시간

당신이 당신을 도울 것입니다 쿼리와 관련이 있습니다.

0

이것은 당신이 요구하는 것처럼 들리는 것을 제공합니다. 아마 더 나은 해결책이있을 것이라고 확신하지만,이를 위해 머리가 날아 들었습니다. 이것의 대부분은 작업 할 임시 테이블을 만든 곳입니다. 아래의 별표는 작업을 수행하는 쿼리입니다.

--created a table filled with the dates of every day between now and the 14th. 
DECLARE @days datetime 
SET @days = GETDATE() 
CREATE TABLE #daylist (
dateofwork datetime) 
WHILE @days < '02/14/2014' 
    BEGIN 
    SELECT @days 
    INSERT INTO #daylist (dateofwork) 
    VALUES (@days) 
    SET @days = DATEADD(d, 1, @days) 
    END 

--created a table of employees with work dates and times 
CREATE TABLE #emps (
ID varchar(10), 
timein varchar(10), 
timedone varchar(10), 
dateofwork datetime 
) 
--inserted values for that table 
INSERT INTO #emps (ID, timein, timedone, dateofwork) 
VALUES ('123', '08:00', '17:00', '02/12/2014'), 
    ('789', '07:00', '18:00', '02/11/2014') 

--******************************************************** 
--used this to get each employee matched with every date showing 
--00:00 on all the days they didn't work 
SELECT CONVERT(varchar,d.dateofwork,101) AS dateofwork, 
t.ID, 
ISNULL(timein, '00:00') AS timein, 
ISNULL(timedone, '00:00') AS timedone 
FROM #daylist d 
    INNER JOIN (SELECT e.ID, d.dateofwork 
       FROM #emps e, #daylist d) AS t ON CONVERT(varchar,d.dateofwork,101) =  CONVERT(varchar,t.dateofwork,101) 
    LEFT JOIN #emps e ON CONVERT(varchar,e.dateofwork,101) =  CONVERT(varchar,t.dateofwork,101) 
      AND e.ID = t.id 
ORDER BY dateofwork 
관련 문제