我有两个日期列,EffDate
和TermDate
。第一次插入记录时,TermDate
为NULL
。添加其他记录后,现在应为第一条记录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
的几条记录插入数据库后的输出:
输出&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;日期,以便没有重叠的EffDate
和TermDate
范围。
我意识到,至少,我需要删除AND T1.TermDate IS NULL
,因为当第三条记录在另外两条记录之间有EffDate
时,它会阻止它重新评估两条记录#39;插入了范围。但我不确定如何评估TermDate
,以便对具有现有日期的记录进行适当的重新评估,并在必要时指定日期。
答案 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.EffDate
和tb2.EffDate
之间