Следующий скрипт вычисляет оставшиеся временные интервалы после вычитания других определенных временных интервалов.
В конце концов мне остается интервал, заполненный пробелами.
Вот сценарий, который я создал.Кто-нибудь знает лучший способ сделать это?
SELECT * FROM SuspensionPeriod susPer WHERE id_document = 564148
DECLARE @idDocument BIGINT, @docBeginDate DATETIME, @docEndDate DATETIME
SET @idDocument = 564148
SELECT @docBeginDate = start_date, @docEndDate = end_date FROM Document md WHERE md.id_document = @idDocument
SELECT RowNum = Row_number() OVER(ORDER BY suspended_from), *
INTO #SuspensionPeriods
FROM SuspensionPeriod susPer WHERE susPer.id_document = @idDocument
DECLARE @MaxRownum INT
SET @MaxRownum = (SELECT Max(RowNum) FROM #SuspensionPeriods)
DECLARE @Iter INT
SET @Iter = (SELECT Min(RowNum) FROM #SuspensionPeriods)
DECLARE @intervalBegin DATETIME, @intervalEnd DATETIME
WHILE @Iter <= @MaxRownum
BEGIN
IF @Iter = 1
BEGIN
SET @intervalBegin = @docBeginDate
SELECT @intervalEnd = suspended_from FROM #SuspensionPeriods WHERE RowNum = @Iter
print dbo.fnFormatDate(@intervalBegin,'yyyy.MM.dd')
print dbo.fnFormatDate(@intervalEnd,'yyyy.MM.dd')
print '============================='
--SELECT @intervalBegin = suspended_until FROM #SuspensionPeriods WHERE RowNum = @Iter
--SELECT @intervalEnd = suspended_from FROM #SuspensionPeriods WHERE RowNum = @Iter + 1
--print dbo.fnFormatDate(@intervalBegin,'yyyy.MM.dd')
--print dbo.fnFormatDate(@intervalEnd,'yyyy.MM.dd')
--print '============================='
END
IF @Iter <> 1 AND @Iter <> @MaxRownum
BEGIN
SELECT @intervalBegin = suspended_until FROM #SuspensionPeriods WHERE RowNum = @Iter - 1
SELECT @intervalEnd = suspended_from FROM #SuspensionPeriods WHERE RowNum = @Iter
print dbo.fnFormatDate(@intervalBegin,'yyyy.MM.dd')
print dbo.fnFormatDate(@intervalEnd,'yyyy.MM.dd')
print '============================='
SELECT @intervalBegin = suspended_until FROM #SuspensionPeriods WHERE RowNum = @Iter
SELECT @intervalEnd = suspended_from FROM #SuspensionPeriods WHERE RowNum = @Iter + 1
print dbo.fnFormatDate(@intervalBegin,'yyyy.MM.dd')
print dbo.fnFormatDate(@intervalEnd,'yyyy.MM.dd')
print '============================='
END
IF @Iter = @MaxRownum
BEGIN
--SELECT @intervalBegin = suspended_until FROM #SuspensionPeriods WHERE RowNum = @Iter - 1
--SELECT @intervalEnd = suspended_from FROM #SuspensionPeriods WHERE RowNum = @Iter
--print dbo.fnFormatDate(@intervalBegin,'yyyy.MM.dd')
--print dbo.fnFormatDate(@intervalEnd,'yyyy.MM.dd')
--print '============================='
SELECT @intervalBegin = suspended_until FROM #SuspensionPeriods WHERE RowNum = @Iter
SELECT @intervalEnd = @docEndDate
print dbo.fnFormatDate(@intervalBegin,'yyyy.MM.dd')
print dbo.fnFormatDate(@intervalEnd,'yyyy.MM.dd')
print '============================='
END
-- run your operation here
SET @Iter = @Iter + 1
END
DROP TABLE #SuspensionPeriods