我有一个基于三列的复合主键表。
(Unit, Account, service)
我还有另外两列:DOB
(这可以保留出生日期)& Age
(这是一个新的int列,需要根据DOB进行更新,结果将是几年的整数值)
我知道如何检索年龄
的resltselect datediff(Year,DOB,GETDATE()) as AGE
但不确定如何根据行DOB数据更新整个表。
列为Unit, Account, Service, DOB, Age
答案 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());
这将根据您的要求更新整个表格。
但是,我强烈建议您在这里查看所有其他答案。特别是关于上述公式中计算误差的那些。