2010-09-20 112 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」格式,您可以輕鬆地連接字段。希望這可以幫助你一些。