如何在插入或更新另一条记录时更新所有记录上的日期字段?
这update
运行作为存储proceducre即会insert
或update
记录在我的Information
表的一部分:如何在插入或更新另一条记录时更新所有记录上的日期字段?
UPDATE [Information] SET
[TermDate] = @aEffDate
WHERE [InformationID] = (SELECT ISNULL(MAX(InformationID),0)
FROM Information
WHERE InformationID < @aInformationID
AND [DeletedBy] IS NULL
AND [DeletedOn] IS NULL
AND Code = @aCode)
基本上,它看起来第二最新的记录(根据关ID),并将该记录的TermDate
到当前记录的EffDate
。问题是,这假定用户以最新到最新的顺序输入记录。
我已经在上面嵌套的select
声明中添加了另一个子句,以包含AND EffDate < @aEffDate
,它确保日期不会不当地终止。不过,现在我只是有null
TermDate列了一堆记录时从MAX(InformationID)
返回的记录有更大的EffDate
所以,假设以下
1)记录与2015年11月2日EffDate进入
2)记录与2015年9月1日EffDate
3)进入记录与2015年10月3日输入EffDate
4)记录与09/15/201输入5 EffDate
数据库会看看这个:
InformationID | EffDate | TermDate --------------------------------------------- 1 | 11/02/15 | 09/01/15 2 | 09/01/15 | 10/03/15 3 | 10/03/15 | 09/15/15 4 | 09/15/15 | NULL
但它应该是这样的:
InformationID | EffDate | TermDate --------------------------------------------- 1 | 11/02/15 | NULL 2 | 09/01/15 | 09/15/15 3 | 10/03/15 | 11/02/15 4 | 09/15/15 | 10/03/15
用户应该在的秩序已经进入了记录2,4,3, 1,这将为每个记录分配适当的TermDate。但不幸的是,我们不能强迫他们这样做。
问题如何获得EffDate与另一个记录的EffDate最接近但不小于另一个记录的EffDate并将该值指定为另一个记录的TermDate?
我已经删除了InformationID
的检查,以确保它们不相同; InformationID <> @aInformationID
但除此之外,我无法弄清楚如何得到“最接近”的日期。
使用窗口函数和可更新的CTE /子查询。作为你的问题的正式答案,这应该得到倒数第二:
with toupdate as (
select i.*,
row_number() over (order by effdate desc) as seqnum
from Information
where DeletedBy IS NULL and DeletedOn IS NULL and Code = @aCode
)
update toupdate
set TermDate = @aEffDate
where seqnum = 2;
这没有考虑到“最接近EffDate”的要求,是吗?我重新编辑了我的文章,以更清晰的当前数据样本以及它应该如何*,而不是。基本上,如果您插入3个日期,则“最老”记录应该具有“中值”记录的日期,而不仅仅是“最新”记录的日期。 – sab669
请编辑您的问题,并提供样本数据和所需的结果。 –