SQL合并数据以获取时间表

时间:2018-12-17 07:48:17

标签: sql-server sql-server-2016

我需要合并来自不同系统的2组数据。一种来自门禁安全系统,另一种来自人力资源假期系统。

最终目标是创建一个准确的时间表,以了解人们在建筑物中待了多长时间-我面临的困难是半天。

因此,一名员工在08:25进入建筑物,在12:45离开。人力资源系统显示半天12:00到16:00(由于人力资源系统的时间间隔较大,因此时间不会一直累积)。

  

第一结果将是08:25开始和16:00完成(10月1日)

     

第二个结果将是08:00开始和16:12结束(10月2日)

..但节假日可以是AM和PM。因此可能是相反的情况。我一直在尝试使用不同的MAXMINS,并尝试使用RANKCASE WHEN,但无法始终如一地正确获取数字。

这是数据的原始示例

SELECT 123456 AS EmployeeID
        , 'John Jones' AS EmployeeName
        , '01-Oct-2018' AS DateEvent
        , '08:25:00' AS EnterTime
        , '12:45:00' AS LeaveTime
        , 'DOOR' AS EventType
UNION ALL
SELECT 123456 AS EmployeeID
        , 'John Jones' AS EmployeeName
        , '01-Oct-2018' AS DateEvent
        , '12:00:00' AS StartTime
        , '16:00:00' AS EndTime
        , 'HOL' AS EventType
UNION ALL
SELECT 123456 AS EmployeeID
        , 'John Jones' AS EmployeeName
        , '02-Oct-2018' AS DateEvent
        , '12:30:00' AS EnterTime
        , '16:12:00' AS LeaveTime
        , 'DOOR' AS EventType
UNION ALL
SELECT 123456 AS EmployeeID
        , 'John Jones' AS EmployeeName
        , '02-Oct-2018' AS DateEvent
        , '08:00:00' AS StartTime
        , '12:00:00' AS EndTime
        , 'HLL' AS EventType

1 个答案:

答案 0 :(得分:0)

看看下面的查询

select * into #tempEvent from(
SELECT 123456 AS EmployeeID
        , 'John Jones' AS EmployeeName
        , '01-Oct-2018' AS DateEvent
        , '08:25:00' AS EnterTime
        , '12:45:00' AS LeaveTime
        , 'DOOR' AS EventType
UNION ALL
SELECT 123456 AS EmployeeID
        , 'John Jones' AS EmployeeName
        , '01-Oct-2018' AS DateEvent
        , '12:00:00' AS StartTime
        , '16:00:00' AS EndTime
        , 'HOL' AS EventType
UNION ALL
SELECT 123456 AS EmployeeID
        , 'John Jones' AS EmployeeName
        , '02-Oct-2018' AS DateEvent
        , '12:30:00' AS EnterTime
        , '16:12:00' AS LeaveTime
        , 'DOOR' AS EventType
UNION ALL
SELECT 123456 AS EmployeeID
        , 'John Jones' AS EmployeeName
        , '02-Oct-2018' AS DateEvent
        , '08:00:00' AS StartTime
        , '12:00:00' AS EndTime
        , 'HLL' AS EventType
)event

select * from #tempEvent

select EmployeeID,  EmployeeName, dateevent, min(entertime) as start, max(leavetime) as finish 
from #tempEvent
group by EmployeeID,    EmployeeName, dateevent

输出如下所示

EmployeeID  EmployeeName    dateevent   start       finish
123456      John Jones      01-Oct-2018 08:25:00    16:00:00
123456      John Jones      02-Oct-2018 08:00:00    16:12:00