Попробуй это. Вы использовали event_start и event_stop в своем SQL, но они не были определены в таблице Events. Единственное, что вы перепутали, было start_time <= @CurrentTime AND end_time> = @CurrentTime. Я не думаю, что ваш код неуклюжий. UNION ALL работает лучше, чем UNION (UNION работает как DISTINCT: сначала ORDER BY, затем удаляйте дубликаты).
DROP TABLE #Events
CREATE TABLE #Events (
event_id INT NOT NULL,
title VARCHAR(80) NOT NULL,
description VARCHAR(200),
start_time DATETIME,
end_time DATETIME,
group_id INT NOT NULL,
recurring bit
);
INSERT INTO #Events(event_id, title, description, start_time, end_time, group_id, recurring) VALUES
(1, 'meeting1', 'meeting1', '20000101', '20000102', 1, 0),
(2, 'meeting2', 'meeting2', '20120309', '20120310', 1, 0),
(3, 'meeting3', 'meeting3', '20120311', '20120312', 1, 0),
(10, 'meeting10', 'meeting10', '20000101', '20000102', 1, 1),
(20, 'meeting20', 'meeting20', '20120309', '20120310', 1, 1),
(30, 'meeting30', 'meeting30', '20120311', '20120312', 1, 1)
DECLARE @CurrentTime DATETIME
SET @CurrentTime = GETDATE()
SELECT event_id,
title,
description,
start_time,
end_time,
group_id,
recurring
FROM #Events
WHERE recurring = 0 AND
-- user_id = ? AND
start_time <= @CurrentTime AND
end_time >= @CurrentTime
UNION ALL
SELECT event_ID,
title,
description,
DATEADD(WEEK, Interval, start_time) [event_start],
DATEADD(WEEK, Interval, end_time) [event_end],
group_id,
recurring
FROM #Events,
(SELECT ROW_NUMBER() OVER(ORDER BY Object_ID) [Interval]
FROM SYS.OBJECTS) as T
WHERE recurring = 1 AND
Interval <= 52 AND
-- user_id = ? AND
start_time <= @CurrentTime AND
end_time >= @CurrentTime
;