2015-11-03 44 views
0

我有两个日期列EffDateTermDate。当第一次插入记录时,TermDateNULL。当添加附加记录时,现在应该为第一条记录的TermDate分配第二条记录的EffDate的值,假设#2的EffDate晚于第一条。如果第二条记录的EffDate在#1之前,那么#2应该将其TermDate设置为#1的EffDate。基本上,每当插入或更新记录时,数据库都需要重新评估所有记录并将它们链接起来,以便在所有日期之间只有尽可能小的时间范围。如何迭代一组记录并在添加或更改记录时“重新关联”日期

我发现这个职位的SO: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) 

然后,当我加载了软件,并插入一个新的记录,它似乎并没有回去,“更新”以前所有的记录,因为我是希望。这里是插入随机EffDate的一些记录到数据库后的输出:

enter image description here

输出&分析

 
    | 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相关联的所有记录,并确保每个日期指向下一个“最近”日期,以便没有重叠EffDateTermDate ran水电站。

我意识到,至少我需要删除AND T1.TermDate IS NULL,因为这会阻止它在插入其他两个范围之间的EffDate的第三条记录时重新评估两条记录。但我不确定我应该如何评估TermDate,以便在有必要时适当重新评估具有现有日期的记录并分配日期。

+0

幸福感的表中没有其它记录,这是比坏的多。当有两个相同的EffDate时会发生什么? – PeterRing

+1

你提到的答案有一个较差的答案。我提供了一个更安全的答案。 –

+0

@PeterRing软件不允许两个记录具有相同的'EffDate' – sab669

回答

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大于tb.EffDate的同一表tb2的所有行;和(C)再次加入从表tb3所有行与EffDate > tb.EffDate AND EffDate<tb2.EffDate

的最终条件tb3.EffDate is null将确保不存在与EffDate tb.EffDatetb2.EffDate

+0

使用此方法突出显示的行[此处显示](http://i.stack.imgur.com/SQyYD.png)不正确。第3行应该在5日结束,第6行在30日结束,25日在第8行,12日在第9行结束。 – sab669

+0

运行查询后,您应该只在TermDate列上有一个空值 – Andy

+0

您是对的,那里*应该*仅为1.但是却有4个。此查询在每个表的“插入”或“更新”之后运行,所以在最终插入运行后,*应该*仅为1。但不幸的是,情况并非如此。 – sab669