2010-09-20 196 views
4

当两个表中给出TSQL查找重叠时间

EMPLOYEE表

EmpID Name 
1  Jon 
2  Smith 
3  Dana 
4  Nancy 

实验室表

EmpID StartTime EndTime Date   LabID 
1  10:00 AM 12:15 PM 01/JAN/2000  Lab I 
1  11:00 AM 14:15 PM 01/JAN/2000  Lab II 
1  16:30 PM 18:30 PM 01/JAN/2000  Lab I 

2  10:00 AM 12:10 PM 01/JAN/2000  Lab I 

从给定的细节,我必须找出重叠小时以及每个员工在每个日期不重叠的小时数。 (StartTime和EndTime的类型为varchar)。

The expected output is 
------------------------------------------------------------------------------- 
EmpID| Name| Overlapping     | Non-Overlapping  | Date 
       Period      Period 
------------------------------------------------------------------------------- 
1  Jon | 10:00 AM to 12:15 PM  |16:30 PM to 18:30 PM | 01/JAN/2000 
      | AND      |      | 
      | 11:00 AM to 14:15 PM  |      | 
      | AND ...(If any)   |      | 
-------------------------------------------------------------------------------- 

2 Smith|  NULL     | 10:00 AM to 12:10 PM |01/JAN/2000 
-------------------------------------------------------------------------------- 

请帮助我使用TSQL(SQL Server 2005/2008)带来这样的输出。

回答

1

首先,您应该考虑使用DateTime字段来存储StartTime和EndTime,从而使计算更容易,并且不再需要Date字段。

SELECT t1.EmpID, 
     t1.StartTime, 
     t1.EndTime, 
     t2.StartTime 
     t2.EndTime, 
FROM lab t1 
LEFT OUTER JOIN lab t2 
    ON t2.StartTime BETWEEN t1.StartTime AND t1.EndTime 
     AND t2.EmpID = t1.EmpID 
ORDER BY t1.EmpID, 
     t1.StartTime, 
     t2.StartTime 

这不会让你得到你所列出的EXACT格式,但它很接近。您应该结束了:

| EmpID| Name| Normal Period | Overlapping Period | 
------------------------------------------------------------ 
| 1 | Jon | 10:00 AM | 12:15 PM | 11:00 AM | 02:15 PM | 
------------------------------------------------------------ 
| 2 | Smith | 10:00 AM | 12:10 PM | NULL  | NULL  | 
------------------------------------------------------------ 

正常时段内各个重叠期将在一个新的行显示出来,但没有任何重叠期将只有一行。如果您特别需要“xx:xx xx到xx:xx xx”格式,您可以轻松地连接字段。希望这可以帮助你一些。