2015-11-03 51 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