Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 插入或更新其他记录时,如何更新所有记录上的日期字段?_Sql_Sql Server - Fatal编程技术网

Sql 插入或更新其他记录时,如何更新所有记录上的日期字段?

Sql 插入或更新其他记录时,如何更新所有记录上的日期字段?,sql,sql-server,Sql,Sql Server,此更新作为存储过程的一部分运行,该存储过程将插入或更新我的信息表中的记录: 但它应该是这样的: InformationID | EffDate | TermDate --------------------------------------------- 1 | 11/02/15 | NULL 2 | 09/01/15 | 09/15/15 3 |

此更新作为存储过程的一部分运行,该存储过程将插入或更新我的信息表中的记录:

但它应该是这样的:

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的值,并将该值指定为另一条记录的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个日期,最旧的记录应该具有中间记录的日期,而不仅仅是最新记录的日期。 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
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;