Вот кое-что, с чего можно начать. Это полезно, если вы используете таблицу календаря:
CREATE TABLE dbo.Calendar
(
dt SMALLDATETIME NOT NULL
PRIMARY KEY CLUSTERED
)
GO
SET NOCOUNT ON
DECLARE @dt SMALLDATETIME
SET @dt = '20000101'
WHILE @dt < '20200101'
BEGIN
INSERT dbo.Calendar(dt) SELECT @dt
SET @dt = @dt + 1
END
GO
Код для установки проблемы:
create table #ranges (Start DateTime NOT NULL, Finish DateTime NOT NULL, Priority int NOT NULL)
create table #processed (dt DateTime NOT NULL, Priority int NOT NULL)
ALTER TABLE #ranges ADD PRIMARY KEY (Start,Finish, Priority)
ALTER TABLE #processed ADD PRIMARY KEY (dt)
declare @day0 datetime,
@day1 datetime,
@day2 datetime,
@day3 datetime,
@day4 datetime,
@day5 datetime
select @day0 = '2000-01-01',
@day1 = @day0 + 1,
@day2 = @day1 + 1,
@day3 = @day2 + 1,
@day4 = @day3 + 1,
@day5 = @day4 + 1
insert #ranges values (@day0, @day5, 0)
insert #ranges values (@day1, @day4, 1)
insert #ranges values (@day2, @day3, 2)
insert #ranges values (@day1, @day4, 0)
Фактическое решение:
DECLARE @start datetime, @finish datetime, @priority int
WHILE 1=1 BEGIN
SELECT TOP 1 @start = start, @finish = finish, @priority = priority
FROM #ranges
ORDER BY priority DESC, start, finish
IF @@ROWCOUNT = 0
BREAK
INSERT INTO #processed (dt, priority)
SELECT dt, @priority FROM calendar
WHERE dt BETWEEN @start and @finish
AND NOT EXISTS (SELECT * FROM #processed WHERE dt = calendar.dt)
DELETE FROM #ranges WHERE @start=start AND @finish=finish AND @priority=priority
END
Результаты: SELECT * FROM # обработано
dt Priority
----------------------- -----------
2000-01-01 00:00:00.000 0
2000-01-02 00:00:00.000 1
2000-01-03 00:00:00.000 2
2000-01-04 00:00:00.000 2
2000-01-05 00:00:00.000 1
2000-01-06 00:00:00.000 0
Решение не в том же формате, но идея есть.