根据 id 使用增量日期更新列

Update column with incremental date based on id

我有 table T1:

Id    Invoice    Date
1     A100
2     B100

我想用基于 ID

的增量日期更新 table T1

想要的结果:

Id    Invoice    Date
1     A100       GetDate()
2     B100       GetDate()+1

有没有这样的东西:

update T1
set [Date]= GetDate() + ROW_NUMBER() over (order by id)
from T1

这是您要找的吗?根据 id

更新日期列
    update T1
    set [Date]= GetDate() + (id-1)
    from T1

使用dateadd

    update T2     
    SET  T2.D=dateadd(dd,T3.rn,getdate())
      FROM 
      T1 as t2 INNER JOIN 
      (
      select *,ROW_NUMBER() over (order by [id]) as rn from T1
      ) T3 ON t2.id=t3.id

一种方法是使用 CTE 通过 ROW_NUMBERDATEADD 评估新日期,然后 UPDATE 使用 CTE 中的值:

USE Sandbox;
GO

CREATE TABLE TestTable (ID int IDENTITY, SomeDate date)
INSERT INTO dbo.TestTable (SomeDate)
VALUES (GETDATE()),(GETDATE()),(GETDATE()),(GETDATE()),(GETDATE());
GO

SELECT *
FROM TestTable;
GO
WITH NewDates AS(
    SELECT ID, DATEADD(DAY, ROW_NUMBER() OVER (ORDER BY TT.ID), GETDATE()) AS NewDate
    FROM dbo.TestTable TT)
UPDATE TT
SET SomeDate = ND.NewDate
FROM dbo.TestTable TT
     JOIN NewDates ND ON TT.ID = ND.ID;
GO
SELECT *
FROM TestTable;

GO
DROP TABLE TestTable;
GO

使用recursive cte生成Iddates,然后join你的table基于Id列来更新日期

with cte as ( 
  select 1 AS Id, getdate() as dt
  union all
  select cte.Id+1, dateadd(d,1,cte.dt) 
  from   cte 
  where  cte.Id < (SELECT MAX(ID) FROM T1)
)
UPDATE T1
SET T1.Date = cte.dt
FROM T1 INNER JOIN cte ON T1.Id = cte.Id

使用与 Larnu 类似但更直接的方法,您可以直接更新 CTE:

WITH cte AS
(
    SELECT  *
    ,       ROW_NUMBER() over (order by id) rn
    FROM    T1
)

UPDATE cte
    SET [date] = DATEADD(DAY, rn, GETDATE())

您不能在更新查询中直接使用 Windowed functions。您应该将逻辑存储在一些 temporary table 中,然后在更新查询中使用该值。一种方法可能如下所示。

 ;with cte as
    (
     select id,Invoice,dateadd(DAY, ROW_NUMBER() over (order by id), GetDate()) as dt
    from T1
    )
    update a
    set a.[date]= cte.dt
    from T1  a join cte on cte.id=a.id
    where a.id=cte.id