【发布时间】:2011-12-07 08:20:45
【问题描述】:
以下脚本计算减去其他特定时间间隔后的剩余时间间隔。
最后我留下了充满空白的间隔。
这是我创建的脚本。有谁知道更好的方法吗?
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
【问题讨论】:
-
“更好”是什么意思?您已经拥有的脚本有什么问题?如果它给出不正确的结果,那么您需要显示一些示例数据并将脚本减少到显示问题所需的最低限度,例如上面的 PRINT 和 cmets 不相关。
-
简短回答 = 是。它的编程非常线性(添加一个行号,因此它可以作为一个递增的while循环来完成,这是糟糕的sql逻辑,你想一次完成所有行)并且可能会切换到基于集合的东西,可能是一个语句。您需要向我们提供一些表架构并更好地了解您要完成的工作,这里没有足够的信息来为您编写示例。
标签: sql-server tsql datetime time intervals