TSQL нахождение перекрывающихся часов - PullRequest
4 голосов
/ 20 сентября 2010

Когда даны две таблицы

Таблица сотрудников

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 Ответ

1 голос
/ 20 сентября 2010

Во-первых, вам, вероятно, следует подумать об использовании поля 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

Это не даст вам точный формат, который вы перечислили, но он близок. Вы должны в конечном итоге:

| 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 to xx: xx xx". Надеюсь, это поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...