我有两个日期列EffDate
和TermDate
。当第一次插入记录时,TermDate
是NULL
。当添加附加记录时,现在应该为第一条记录的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
的一些记录到数据库后的输出:
输出&分析
| 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
相关联的所有记录,并确保每个日期指向下一个“最近”日期,以便没有重叠EffDate
和TermDate
ran水电站。
我意识到,至少我需要删除AND T1.TermDate IS NULL
,因为这会阻止它在插入其他两个范围之间的EffDate
的第三条记录时重新评估两条记录。但我不确定我应该如何评估TermDate
,以便在有必要时适当重新评估具有现有日期的记录并分配日期。
幸福感的表中没有其它记录,这是比坏的多。当有两个相同的EffDate时会发生什么? – PeterRing
你提到的答案有一个较差的答案。我提供了一个更安全的答案。 –
@PeterRing软件不允许两个记录具有相同的'EffDate' – sab669