sql-server - TSQL 查找重叠时间

标签 sql-server tsql

当给出两个表时

员工表

EmpID  Name
1      Jon   
2      Smith  
3      Dana 
4      Nancy

实验室 table
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)带来这样的输出。

最佳答案

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

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

这不会让你得到你列出的确切格式,但它很接近。你应该得到:
| 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”格式,您可以轻松地连接字段。希望这对你有所帮助。

关于sql-server - TSQL 查找重叠时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3753117/

相关文章:

SQL Server - 每个状态提取 X 条随机记录

sql-server - 如何在 Visual Studio 2012 Web Express 中提交数据库表更改?

sql - 修剪 sql 变体

sql-server - SQL Server : setting foreign key to a specific value

sql - 仅当列值为 true 时才连接到表

sql - 我如何在我的 SQL Server Profiler 上关闭来自 "Report Server"的行?

sql-server - ORA-01005 : null password given; logon denied"Error when trying

sql-server - SQL 服务器 : What are ODBC canonical functions?

sql-server - 从列中的 Xml 中提取值

sql-server - 如何防止sql语句被零除错误