我有兩個日期列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