我有一个基于三列的复合主键表。sql server更新新列基于同一表中的另一列
(Unit, Account, service)
我还有另外两列:DOB
(这适用出生日期)& Age
(这是需要根据出生日期被更新,结果将是年整数值的新INT列)
我知道如何检索reslt为
年龄select datediff(Year,DOB,GETDATE()) as AGE
但不知道如何更新基于该行整个表DOB数据。
列是Unit, Account, Service, DOB, Age
我有一个基于三列的复合主键表。sql server更新新列基于同一表中的另一列
(Unit, Account, service)
我还有另外两列:DOB
(这适用出生日期)& Age
(这是需要根据出生日期被更新,结果将是年整数值的新INT列)
我知道如何检索reslt为
年龄select datediff(Year,DOB,GETDATE()) as AGE
但不知道如何更新基于该行整个表DOB数据。
列是Unit, Account, Service, DOB, Age
要回答你的问题:
UPDATE dob.MyTable SET Age = datediff(Year,DOB,GETDATE());
这将更新整个表按您的要求。
不过,我强烈建议你看看这里所有的答案。特别是关于上式中的计算误差。
谢谢塞巴斯蒂安和所有回复的人。我当然会检查公式并根据你和其他人提到的来纠正它。感谢您指出这一点。 – Asghar
摆脱age
列和计算年龄,像这样:
SELECT DATEDIFF(yy, DOB, getdate()) AS age FROM daffyduck
有迹象表明,你需要存储的物品,如年龄非常罕见的病例。由于年龄每天都在变化,您将不得不经常更新您的记录。相反,更好的办法是存储一个固定值,比如可以计算的出生日期。出于这个原因,大多数DBMS都提供了进行日期算术的功能。
当然,这可以作为* computed *列添加,但是@podiluska指出,OP需要首先获取公式。 –
负面年龄?有趣... –
@JonathanLeffler我没有看到负面年龄[这里](http://sqlfiddle.com/#!3/d41d8/5589)。 – Kermit
按照该意见,因为它每天变化(也可能更加频繁,如果你在不同的时区的用户),这是不明智的坚持年龄。
此外,您的年龄VS DOB算法是不准确的 - 看到here为一个更好的
因此,国际海事组织这是一个场景,其中一个非持续COMPUTED柱是有道理的,像这样:
ALTER TABLE Person add Age
AS DateDiff(yy,DOB,CURRENT_TIMESTAMP)
- CASE WHEN DATEPART (mm,DOB) <= DATEPART(mm,CURRENT_TIMESTAMP)
and DATEPART(dd, DOB) <= DATEPART(dd,CURRENT_TIMESTAMP)
THEN 0
ELSE 1
END
我正在运行一个SSIS软件包,老板给我的任务是根据当天运行的软件包输入年龄。年龄栏在交易时有效,这是他们正在寻找的。 – Asghar
不要存储可以计算的字段。 – Kermit
你的年龄公式不起作用。试试'DATEDIFF(year,'2010-12-1',getdate())'看看。 – podiluska
年龄不断变化......就你而言,你必须每天更新年龄栏。相反,只要你需要计算年龄。 – Kaf