2012-10-26 171 views
0

我有一个基于三列的复合主键表。sql server更新新列基于同一表中的另一列

(Unit, Account, service)

我还有另外两列:DOB(这适用出生日期)& Age(这是需要根据出生日期被更新,结果将是年整数值的新INT列)

我知道如何检索reslt为

年龄
select datediff(Year,DOB,GETDATE()) as AGE 

但不知道如何更新基于该行整个表DOB数据。

列是Unit, Account, Service, DOB, Age

+5

不要存储可以计算的字段。 – Kermit

+4

你的年龄公式不起作用。试试'DATEDIFF(year,'2010-12-1',getdate())'看看。 – podiluska

+2

年龄不断变化......就你而言,你必须每天更新年龄栏。相反,只要你需要计算年龄。 – Kaf

回答

1

要回答你的问题:

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

这将更新整个表按您的要求。

不过,我强烈建议你看看这里所有的答案。特别是关于上式中的计算误差。

+0

谢谢塞巴斯蒂安和所有回复的人。我当然会检查公式并根据你和其他人提到的来纠正它。感谢您指出这一点。 – Asghar

1

摆脱age列和计算年龄,像这样:

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

有迹象表明,你需要存储的物品,如年龄非常罕见的病例。由于年龄每天都在变化,您将不得不经常更新您的记录。相反,更好的办法是存储一个固定值,比如可以计算的出生日期。出于这个原因,大多数DBMS都提供了进行日期算术的功能。

+1

当然,这可以作为* computed *列添加,但是@podiluska指出,OP需要首先获取公式。 –

+0

负面年龄?有趣... –

+0

@JonathanLeffler我没有看到负面年龄[这里](http://sqlfiddle.com/#!3/d41d8/5589)。 – Kermit

2

按照该意见,因为它每天变化(也可能更加频繁,如果你在不同的时区的用户),这是不明智的坚持年龄。

此外,您的年龄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 
+0

我正在运行一个SSIS软件包,老板给我的任务是根据当天运行的软件包输入年龄。年龄栏在交易时有效,这是他们正在寻找的。 – Asghar

相关问题