如何迭代一组记录和"重新关联"添加或更改记录时的日期

时间:2015-11-03 14:24:42

标签: sql sql-server

我有两个日期列,EffDateTermDate。第一次插入记录时,TermDateNULL。添加其他记录后,现在应为第一条记录TermDate分配第二条记录EffDate的值,假设为#2' s EffDate比第一个晚。如果第二条记录EffDate在#1&#39}之前,则#2应将其TermDate设置为#1' s EffDate。基本上,每当插入或更新记录时,数据库都需要重新评估所有记录并将它们链接起来,以便所有日期之间只有尽可能小的时间。

我发现了这个帖子:Creating new date field dynamically from next row

但选定的答案并不适合我。这是我使用的查询:

UPDATE T1 SET
    T1.[TermDate] = @aEffDate
FROM [Information] T1
WHERE T1.[InformationID] IN (SELECT ISNULL(T1.InformationID, 0)
    FROM [Information] T1 INNER JOIN [Information] T2 on T1.InformationID = T2.InformationID - 1
    WHERE  T1.InformationID <>  @aInformationID
        AND T1.[DeletedBy] IS NULL
        AND T1.[DeletedOn] IS NULL
        AND T1.Code = @aCode
        AND T1.TermDate IS NULL
        AND T1.EffDate < @aEffDate)

然后,当我加载软件并插入新记录时,它似乎没有返回并且&#34;更新&#34;所有以前的记录,因为我希望。以下是将带有随机EffDate的几条记录插入数据库后的输出:

enter image description here

输出&amp;分析

    | InformationID |  EffDate  |  TermDate  | IsGood |  ShouldBe  |
--------------------------------------------------------------------
 1  |    5756       | 07/19/15  |  09/19/15  |   N    |   07/25/15 |
 2  |    5757       | 06/30/15  |  07/10/15  |   Y    |     N/A    |
 3  |    5758       | 08/01/15  |  09/19/15  |   Y    |     N/A    |
 4  |    5759       | 07/25/15  |  09/19/15  |   N    |   08/01/15 |
 5  |    5760       | 09/19/15  |    NULL    |   Y    |     N/A    |
 6  |    5761       | 07/10/15  |    NULL    |   N    |   07/19/15 |

我需要它,以便每当添加新记录时,它都会重新评估与给定Code相关联的所有记录,并确保每个日期指向下一个&#34;最接近的&# 34;日期,以便没有重叠的EffDateTermDate范围。

我意识到,至少,我需要删除AND T1.TermDate IS NULL,因为当第三条记录在另外两条记录之间有EffDate时,它会阻止它重新评估两条记录#39;插入了范围。但我不确定如何评估TermDate,以便对具有现有日期的记录进行适当的重新评估,并在必要时指定日期。

1 个答案:

答案 0 :(得分:1)

update tb
set tb.termdate=tb2.effdate
from InfoTable tb
left outer join InfoTable tb2 on tb2.effdate>tb.effdate
left outer join InfoTable tb3 on tb3.effdate<tb2.effdate and tb3.effdate>tb.effdate
where tb3.effdate is null

这将:(A)选择表tb中的所有行; (B)加入EffDate大于tb2的同一个表tb.EffDate中的所有行; (C)再次将表tb3中的所有行与EffDate > tb.EffDate AND EffDate<tb2.EffDate

连接起来

最终条件tb3.EffDate is null将确保表格中没有其他记录,其中EffDate位于tb.EffDatetb2.EffDate之间