отказ от ответственности: Я бы серьезно подумал о другой конструкции стола.Присоединение к датам или временам никогда не является хорошей идеей.Если у вас был идентификатор запускаемого события, вы можете легко ВЕРНУТЬСЯ, ЧТОБЫ попытаться найти соответствующий конец этого события.
Для SQL Server попробуйте:
DECLARE @Events table (EventTime char(5), EventType varchar(5))
INSERT INTO @Events VALUES ('08:00','Start')
INSERT INTO @Events VALUES ('09:00','Stop')
INSERT INTO @Events VALUES ('10:30','Start')
INSERT INTO @Events VALUES ('10:45','Stop')
INSERT INTO @Events VALUES ('11:00','Start')
INSERT INTO @Events VALUES ('11:15','Start')
INSERT INTO @Events VALUES ('12:00','Stop')
INSERT INTO @Events VALUES ('12:30','Stop')
SELECT
dt.StartTime, dt.StopTime
FROM (SELECT
p.EventTime AS StartTime,CASE WHEN c.EventType!='Stop' THEN NULL ELSE c.EventTime END AS StopTime
,p.EventTime AS SortBy
FROM @Events p
INNER JOIN @Events c ON p.EventTime<c.EventTime
WHERE p.EventType='Start'
AND c.EventTime=(SELECT MIN(EventTime) FROM @Events WHERE EventTime>p.EventTime)
UNION
SELECT
NULL AS StartTime,p.EventTime
,p.EventTime AS SortBy
FROM @Events p
INNER JOIN @Events c ON p.EventTime>c.EventTime
WHERE p.EventType='STOP'
AND c.EventTime=(SELECT MAX(EventTime) FROM @Events WHERE EventTime<p.EventTime)
AND c.EventType='Stop'
) dt
ORDER BY dt.SortBy
ВЫХОД:
StartTime StopTime
--------- --------
08:00 09:00
10:30 10:45
11:00 NULL
11:15 12:00
NULL 12:30
(5 row(s) affected)