2015-11-02 46 views
0

update运行作为存储proceducre即会insertupdate记录在我的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但除此之外,我无法弄清楚如何得到“最接近”的日期。

+1

请编辑您的问题,并提供样本数据和所需的结果。 –

回答

0

使用窗口函数和可更新的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; 
+0

这没有考虑到“最接近EffDate”的要求,是吗?我重新编辑了我的文章,以更清晰的当前数据样本以及它应该如何*,而不是。基本上,如果您插入3个日期,则“最老”记录应该具有“中值”记录的日期,而不仅仅是“最新”记录的日期。 – sab669

相关问题