这应该可以解决问题:
DECLARE @t TABLE(
Asset nvarchar(100),
StartDate datetime,
EndDate datetime,
Code nvarchar(100),
Reason nvarchar(100)
);
DECLARE @StartDate DATETIME = '2017-01-01 00:00:00';
DECLARE @EndDate DATETIME = '2017-01-02 20:00:00';
INSERT INTO @t VALUES ('Asset 1', '2017-01-01 06:00:00', '2017-01-01 09:00:00', 'Code 1', 'Reason 1')
,('Asset 1', '2017-01-01 15:00:00', '2017-01-01 16:00:00', 'Code 1', 'Reason 2')
,('Asset 1', '2017-01-02 12:00:00', '2017-01-02 13:00:00', 'Code 2', 'Reason 2')
,('Asset 2', '2017-01-01 07:00:00', '2017-01-01 08:00:00', 'Code 1', 'Reason 1')
,('Asset 2', '2017-01-01 11:00:00', '2017-01-01 14:00:00', 'Code 1', 'Reason 2')
,('Asset 2', '2017-01-02 15:00:00', '2017-01-02 18:00:00', 'Code 2', 'Reason 2')
,('Asset 2', '2017-01-02 18:00:00', '2017-01-02 19:00:00', 'Code 2', 'Reason 2');
WITH cte AS(
SELECT *
,EndDate AS StartDateNew
,ISNULL(LEAD(StartDate) OVER (PARTITION BY Asset ORDER BY StartDate), @EndDate) AS EndDateNew
,CASE WHEN EndDate = LEAD(StartDate) OVER (PARTITION BY Asset ORDER BY StartDate) OR EndDate = @EndDate THEN 0 ELSE 1 END AS HasGap
,ROW_NUMBER() OVER (PARTITION BY Asset ORDER BY StartDate) AS rn
FROM @t t
WHERE StartDate >= @StartDate
)
SELECT Asset, StartDate, EndDate, Code, Reason
FROM cte
UNION ALL
SELECT Asset, StartDateNew, EndDateNew, 'Code10', 'Reason10'
FROM cte
WHERE HasGap = 1
UNION ALL
SELECT Asset, @StartDate AS StartDate, StartDate AS EndDate, 'Code10', 'Reason10'
FROM cte
WHERE rn = 1
AND StartDate > @StartDate
ORDER BY 1, 2