disclaimer:
I would seriously consider a different table design. Joining on dates and or times is never a good idea. If you had an ID of the event that is starting, you could easily LEFT JOIN to try to find the matching end of that event.
For SQL Server try:
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
OUTPUT:
StartTime StopTime
--------- --------
08:00 09:00
10:30 10:45
11:00 NULL
11:15 12:00
NULL 12:30
(5 row(s) affected)