根据 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_NUMBER
和 DATEADD
评估新日期,然后 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
生成Id
和dates
,然后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
我有 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_NUMBER
和 DATEADD
评估新日期,然后 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
生成Id
和dates
,然后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