【问题标题】:Calculate remaining time intervals(begin date -> end date) after substracting other time intervals减去其他时间间隔后计算剩余时间间隔(开始日期 -> 结束日期)
【发布时间】: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


【解决方案1】:

怎么样

SELECT MIN(md.start_date), MIN(sp.suspended_from)
    FROM Document md
    JOIN SuspensionPeriod sp ON sp.id_document = md.id_document
    WHERE md.id_document = @idDocument
UNION
SELECT sp.suspended_to, (SELECT COALESCE(MIN(spnext.suspended_from), md.end_date) FROM SuspensionPeriod spnext WHERE sp.id_document=spnext.id_document AND spnext.suspended_from > sp.suspended_to)
    FROM Document md
    JOIN SuspensionPeriod sp ON sp.id_document = md.id_document
    WHERE md.id_document = @idDocument

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-07
    • 2020-04-11
    • 2018-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多