2017-12-20 1 views
1

Ich würde gerne herausfinden, wie viele Stunden ein Mitarbeiter innerhalb und außerhalb des Büros in seinen Dienstzeiten war.Vergleichen Sie zwei verschiedene Tabelle und finden Sie nicht übereinstimmende Zeitstempel

unten ist die Dienstzeiten des Mitarbeiters

CASE # 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 

unterhalb der Anwesenheitsstunden des Mitarbeiters ist (innerhalb Büro-Timings)

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 

Wenn Sie über zwei Tabellen vergleichen , die erwarteten inneren und äußeren Zeitvorgaben gegen Dienstzeiten sollten unter:

liegen
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 

Aber ich bin immer Ergebnisse als:

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 

Ich hoffe, dass ich meine Frage geklärt und unten ist die Abfrage, die ich für diesen Zweck geschrieben:

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 

Was soll ich d bekommen das erwartete Ergebnis?

**

EDIT

**

Below Antwort für den obigen Fall arbeitet und nicht für den folgenden Fall zu arbeiten.

unten ist die

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 

Below Stunden des Mitarbeiters Pflicht ist die Anwesenheitsstunden des Mitarbeiters (im Büro Timings)

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 

Die innen erwartet und außerhalb der Zeiten sollten die folgenden Zeiten liegen:

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 

Aber ich bin immer Ergebnis nach der Anwendung this Antwort:

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

Warum FromTime 2017-12-11 07: 34: 29.000 ToTime 2017-12-11 12: 30: 00.000 ist draußen? Es passt zu den Mitarbeiter Stunden richtig? – Wocugon

+0

Warum ist '(FromTime, ToTime)' = '(2017-12-11 12: 45: 28.000, 2017-12-11 13: 04: 15.000)' im erwarteten Ergebnis aufgeführt. Dieser Zeitraum liegt außerhalb der Dienstzeiten des Arbeitnehmers, nicht wahr? –

+0

@GiorgosBetsos richtig. aber ich dachte an all seine Zeiten, als er im Büro ist. –

Antwort

0

Ich hoffe, dass die unten genannte Abfrage für Sie arbeiten wird.

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 

Kommentieren Sie Fall Nr. 1 und überprüfen Sie Ihr erwartetes Ergebnis.

Wie @ combatc2 sagte, war der Mitarbeiter auf Fall # 1 war technisch für 12 Sekunden, wenn Sie in das Ergebnis aufnehmen möchten, lassen Sie es mich wissen.

0

Schauen Sie sich dieses Beispiel - ich denke, es löst, was Sie erreichen wollen; Allerdings glaube ich nicht, dass Ihre erwarteten Ergebnisse völlig korrekt sind - ich denke, Sie vermissen ein "Outside office" von 2017-12-11 07: 30: 00.000 - 2017-12-11 07: 30: 12.000 für den ersten notieren Sie, wie der Angestellter für 12 Sekunden technisch aus war:

--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

Ihre Antwort funktioniert für Fall Nr. 1, aber nicht für Fall Nr. 2. Bitte überprüfen und helfen! –

Verwandte Themen