sql server根据同一个表中的另一列更新新列

时间:2012-10-26 14:14:33

标签: sql sql-server tsql sql-server-2005

我有一个基于三列的复合主键表。

(Unit, Account, service)

我还有另外两列:DOB(这可以保留出生日期)& Age(这是一个新的int列,需要根据DOB进行更新,结果将是几年的整数值)

我知道如何检索年龄

的reslt
select datediff(Year,DOB,GETDATE()) as AGE

但不确定如何根据行DOB数据更新整个表。

列为Unit, Account, Service, DOB, Age

3 个答案:

答案 0 :(得分:2)

根据评论,持久化Age是不明智的,因为它每天都有变化(如果你有不同时区的用户,可能会更频繁)。

此外,您的年龄与DOB算法不准确 - 请参阅here以获得更好的

因此,IMO这是一个非持久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

答案 1 :(得分:1)

删除age列并计算年龄,如下:

SELECT DATEDIFF(yy, DOB, getdate()) AS age FROM daffyduck

极少数情况下您需要存储年龄等项目。由于年龄每天都在变化,您必须经常更新您的记录。相反,最好存储一个固定值,例如可以计算的出生日期。由于这个原因,大多数DBMS提供了执行日期算术的功能。

答案 2 :(得分:1)

回答你的问题:

UPDATE dob.MyTable SET Age = datediff(Year,DOB,GETDATE());

这将根据您的要求更新整个表格。

但是,我强烈建议您在这里查看所有其他答案。特别是关于上述公式中计算误差的那些。