2017-12-20 10 views
1

근무 시간에 직원이 근무한 시간과 근무 시간을 확인하고 싶습니다. 다음은 두 테이블을 비교하여 불일치하는 타임 스탬프를 찾으십시오.

는 두 개의 테이블 위에 비교하면

사례 # 아래

FromDateTime ToDateTime --------------------------------------------------- 2017-12-11 07:30:00.000 2017-12-11 12:30:00.000 2017-12-11 15:30:00.000 2017-12-11 18:30:00.000 

1

(사무실 타이밍 내부) 직원의 출석 시간입니다

InTime       OutTime 
-------------------------------------------------------- 
2017-12-11 07:30:12.000   2017-12-11 07:34:29.000 
2017-12-11 12:45:28.000   2017-12-11 13:04:15.000 
2017-12-11 17:55:15.000   2017-12-11 18:04:28.000 

직원의 근무 시간입니다 , 근무 시간에 대한 예상 내부 및 외부 타이밍은 다음과 같아야합니다 :

나는 내 질문을 삭제하고 아래 나는이 목적을 위해 쓴 쿼리 희망

FromTime     ToTime      Remarks 
----------------------------------------------------------------------- 
2017-12-11 07:30:00.000  2017-12-11 07:30:12.000  Outside Office 
2017-12-11 07:30:12.000  2017-12-11 07:34:29.000  Inside Office 
2017-12-11 07:34:29.000  2017-12-11 12:45:28.000  Outside Office 
2017-12-11 12:45:28.000  2017-12-11 13:04:15.000  Inside Office 
2017-12-11 15:30:00.000  2017-12-11 17:55:15.000  Outside Office 
2017-12-11 17:55:15.000  2017-12-11 18:04:28.000  Inside Office 
2017-12-11 18:04:28.000  NULL      Outside Office 

:로

FromTime     ToTime      Remarks 
----------------------------------------------------------------------- 
2017-12-11 07:30:12.000  2017-12-11 07:34:29.000  Inside Office 
2017-12-11 07:34:29.000  2017-12-11 12:30:00.000  Outside Office 
2017-12-11 12:45:28.000  2017-12-11 13:04:15.000  Inside Office 
2017-12-11 15:30:00.000  2017-12-11 17:55:15.000  Outside Office 
2017-12-11 17:55:15.000  2017-12-11 18:04:28.000  Inside Office 
2017-12-11 18:04:28.000  2017-12-11 18:30:00.000  Outside Office 

하지만 무엇입니까 결과

DECLARE @EmployeeDutyHours TABLE 
(
    FromDateTime DATETIME, 
    ToDateTime DATETIME 
) 

DECLARE @EmployeeAttendanceHours TABLE 
(
    InTime DATETIME, 
    OutTime DATETIME 
) 

INSERT INTO @EmployeeDutyHours 
VALUES ('2017-11-29 07:30:00.000', '2017-11-29 12:30:00.000'), 
     ('2017-11-29 13:30:00.000', '2017-11-29 16:30:00.000') 

INSERT INTO @EmployeeAttendanceHours 
VALUES ('2017-11-29 07:27:24.000', '2017-11-29 09:44:33.000'), 
     ('2017-11-29 11:57:37.000', '2017-11-29 12:05:39.000'), 
     ('2017-11-29 15:12:31.000', '2017-11-29 17:24:32.000') 

SELECT 
    FromTime = eah.InTime, 
    ToTime = eah.OutTime, 
    Message = 'Inside Office' 
FROM @EmployeeAttendanceHours eah 

UNION 

SELECT 
    FromTime = eah.OutTime, 
    ToTime = eh.ToDateTime, 
    Message = 'Outside Office' 
FROM @EmployeeDutyHours eh,@EmployeeAttendanceHours eah 
WHERE eah.OutTime BETWEEN eh.FromDateTime AND eh.ToDateTime 

UNION 

SELECT 
    FromTime = eh.FromDateTime, 
    ToTime = eah.InTime, 
    Message = 'Outside Office' 
FROM @EmployeeDutyHours eh, @EmployeeAttendanceHours eah 
WHERE eah.InTime BETWEEN eh.FromDateTime AND eh.ToDateTime 

ORDER BY 1, 2 

나는 D 얻을해야합니까 예상 된 결과는 무엇입니까?

**

편집

**

Below 대답은 위의 경우를 위해 노력하고 아래의 경우에 작동하지 않습니다. 다음은

은 직원의 근무 시간입니다

CASE # 2

다음
FromDateTime    ToDateTime 
--------------------------------------------------- 
2017-11-29 07:30:00.000 2017-11-29 12:30:00.000 
2017-11-29 13:30:00.000 2017-11-29 16:30:00.000 

은 (사무실 타이밍 내부) 직원의 출석 시간

InTime       OutTime 
-------------------------------------------------------- 
2017-11-29 07:27:24.000   2017-11-29 09:44:33.000 
2017-11-29 11:57:37.000   2017-11-29 12:05:39.000 
2017-11-29 15:12:31.000   2017-11-29 17:24:32.000 

내부을 예상 근무 시간에 대한 외부 시간은 다음과 같아야합니다 :

FromTime     ToTime      Remarks 
----------------------------------------------------------------------- 
2017-11-29 07:27:24.000  2017-11-29 09:44:33.000  Inside Office 
2017-11-29 09:44:33.000  2017-11-29 11:57:37.000  Outside Office 
2017-11-29 11:57:37.000  2017-11-29 12:05:39.000  Inside Office 
2017-11-29 12:05:39.000  2017-11-29 12:30:00.000  Outside Office 
2017-11-29 13:30:00.000  2017-11-29 15:12:31.000  Outside Office 
2017-11-29 15:12:31.000  2017-11-29 17:24:32.000  Inside Office 

하지만 this 대답 적용한 후 결과를 얻고있다 :

FromTime     ToTime      Remarks 
----------------------------------------------------------------------- 
2017-11-29 07:27:24.000  2017-11-29 09:44:33.000  Inside Office 
2017-11-29 07:30:00.000  2017-11-29 11:57:37.000  Outside Office 
2017-11-29 09:44:33.000  2017-11-29 12:30:00.000  Outside Office 
2017-11-29 11:57:37.000  2017-11-29 12:05:39.000  Inside Office 
2017-11-29 12:05:39.000  2017-11-29 12:30:00.000  Outside Office 
2017-11-29 13:30:00.000  2017-11-29 15:12:31.000  Outside Office 
2017-11-29 15:12:31.000  2017-11-29 17:24:32.000  Inside Office 
+0

왜 FromTime 2017-12-11 07 : 34 : 29.000 ToTime 2017-12-11 12 : 30 : 00.000이 (가) 외부에 있습니까? 그것은 직원 시간 맞지? – Wocugon

+0

'(FromTime, ToTime)'='(2017-12-11 12 : 45 : 28.000, 2017-12-11 13 : 04 : 15.000)'이 예상 결과에 나열되는 이유는 무엇입니까? 이 기간은 직원 근무 시간을 벗어났습니다. 그렇죠? –

+0

@GiorgosBetsos가 맞습니다. 그러나 그가 내무부에있을 때 그의 모든 타이밍을 생각했습니다. –

답변

0

나는 아래 질문이 당신을 위해 일 것이라는 점을 희망한다.

DECLARE @EmployeeDutyHours TABLE (
    FromDateTime datetime, 
    ToDateTime datetime 
) 

DECLARE @EmployeeAttendanceHours TABLE (
    InTime datetime, 
    OutTime datetime 
) 


--INSERT INTO @EmployeeDutyHours VALUES ('2017-12-11 07:30:00.000', '2017-12-11 12:30:00.000'),('2017-12-11 15:30:00.000', '2017-12-11 18:30:00.000') 
--INSERT INTO @EmployeeAttendanceHours VALUES ('2017-12-11 07:30:12.000', '2017-12-11 07:34:29.000'), ('2017-12-11 12:45:28.000', '2017-12-11 13:04:15.000'), ('2017-12-11 17:55:15.000', '2017-12-11 18:04:28.000') 

INSERT INTO @EmployeeDutyHours VALUES ('2017-11-29 07:30:00.000', '2017-11-29 12:30:00.000'), ('2017-11-29 13:30:00.000', '2017-11-29 16:30:00.000') 
INSERT INTO @EmployeeAttendanceHours VALUES ('2017-11-29 07:27:24.000', '2017-11-29 09:44:33.000'), ('2017-11-29 11:57:37.000', '2017-11-29 12:05:39.000'), ('2017-11-29 15:12:31.000', '2017-11-29 17:24:32.000') 


;WITH CTE 
AS (SELECT 
    *, 
    LEAD(InTime, 1) OVER (ORDER BY InTime) AS NextIn, 
    LEAD(OutTime, 1, '20491231') OVER (ORDER BY OutTime) AS NextOut, 
    LAG(InTime, 1) OVER (ORDER BY InTime) AS PrevIn, 
    LAG(OutTime, 1) OVER (ORDER BY OutTime) AS PrevOut 
FROM @EmployeeAttendanceHours) 


SELECT 
    a.InTime, 
    a.OutTime, 
    'Inside Office' AS Remarks 
FROM CTE a 

UNION 

SELECT 
    a.OutTime, 
    NextIn, 
    'Outside Office' 
FROM CTE a 
CROSS APPLY (SELECT * FROM @EmployeeDutyHours WHERE (a.InTime < ToDateTime AND a.OutTime > FromDateTime) AND a.NextIn BETWEEN FromDateTime AND ToDateTime) d 

UNION 

SELECT 
    a.OutTime, 
    d.ToDateTime, 
    'Outside Office' 
FROM CTE a 
CROSS APPLY (SELECT * FROM @EmployeeDutyHours WHERE a.OutTime BETWEEN FromDateTime AND ToDateTime AND a.OutTime < ToDateTime AND (a.NextOut > ToDateTime)) d 

UNION 

SELECT 
    FromDateTime, 
    a.InTime, 
    'Outside Office' 
FROM CTE a 
CROSS APPLY (SELECT * FROM @EmployeeDutyHours WHERE a.InTime BETWEEN FromDateTime AND ToDateTime AND a.InTime > FromDateTime AND a.PrevOut NOT BETWEEN FromDateTime AND ToDateTime AND a.PrevIn IS NOT NULL) d 

ORDER BY InTime, OutTime 

의견 # 1 및 예상 결과를 확인하십시오.

@ combatc2가 말한 것처럼 직원은 결과에 포함시키려는 경우 # 1이 기술적으로 12 초 밖에 나오지 않았다고 알려주었습니다.

0

체크 아웃이 예 - 나는 당신이 달성하기 위해 노력하고 무엇을 해결하는 생각을; 그러나 나는 예상 한 결과가 완전히 정확하다고 생각하지 않습니다. 2017-12-11 07 : 30 : 00.000 - 2017-12-11 07 : 30 : 12.000의 "Outside office"가 누락 된 것 같습니다. 직원이 기술적으로 12 초 동안 밖으로 나가기 때문에 기록하십시오 :

--DROP TABLE EmployeeDutyHours 
CREATE TABLE EmployeeDutyHours 
(
    EmployeeId BIGINT, 
    ShiftFromTime DATETIME, 
    ShiftToTime DATETIME 
) 

INSERT INTO dbo.EmployeeDutyHours 
    VALUES (1, '2017-12-11 07:30:00.000', '2017-12-11 12:30:00.000'), 
      (1, '2017-12-11 15:30:00.000', '2017-12-11 18:30:00.000') 

--DROP TABLE EmployeeAttendanceHours 
CREATE TABLE EmployeeAttendanceHours 
(
    EmployeeId BIGINT, 
    InTime DATETIME, 
    OutTime DATETIME 
) 

INSERT INTO dbo.EmployeeAttendanceHours 
    VALUES (1, '2017-12-11 07:30:12.000', '2017-12-11 07:34:29.000'), 
      (1, '2017-12-11 12:45:28.000', '2017-12-11 13:04:15.000'), 
      (1, '2017-12-11 17:55:15.000', '2017-12-11 18:04:28.000') 

SELECT 
    FromTime = eah.InTime, 
    ToTime = eah.OutTime, 
    Message = 'Inside Office' 
FROM EmployeeAttendanceHours eah 

UNION 

SELECT 
    FromTime = eah.OutTime, 
    ToTime = eh.ShiftToTime, 
    Message = 'Outside Office' 
FROM dbo.EmployeeDutyHours eh 
JOIN dbo.EmployeeAttendanceHours eah ON eah.EmployeeId = eh.EmployeeId 
WHERE eah.OutTime BETWEEN eh.ShiftFromTime AND eh.ShiftToTime 

UNION 

SELECT 
    FromTime = eh.ShiftFromTime, 
    ToTime = eah.InTime, 
    Message = 'Outside Office' 
FROM dbo.EmployeeDutyHours eh 
JOIN dbo.EmployeeAttendanceHours eah ON eah.EmployeeId = eh.EmployeeId 
WHERE eah.InTime BETWEEN eh.ShiftFromTime AND eh.ShiftToTime 

ORDER BY 1, 2 
+0

귀하의 답변은 케이스 # 1에서 작동하지만 케이스 # 2에서 고장났습니다. 확인하고 도와주세요! –