如何在SQL Server查询中基于DateOfBirth列更新Age列

问题描述:

我需要编写一个SQL查询来更新DateOfBirth列中的Age列。下面是一个包含一些现成数据的示例表。如何在SQL Server查询中基于DateOfBirth列更新Age列

CREATE TABLE Students 
(
    ID INT IDENTITY, 
    Name VARCHAR (100), 
    DateOfBirth date, 
    Age INT, 
    ClassID INT, 
    SectionID INT, 
    PRIMARY KEY (ID) 
) 

INSERT INTO Students (Name, DateOfBirth, Age, ClassID, SectionID) 
VALUES ('Adam','2003-06-16', 0, 6, 2) 

INSERT INTO Students (Name, DateOfBirth, Age, ClassID, SectionID) 
VALUES ('Botham','2001-03-22', 0, 8, 1) 

INSERT INTO Students (Name, DateOfBirth, Age, ClassID, SectionID) 
VALUES ('Hillton',Null, 0, 7, 2) 

INSERT INTO Students (Name, DateOfBirth, Age, ClassID, SectionID) 
VALUES ('Rasty','2004-12-02', 0, 5, 1) 

INSERT INTO Students (Name, DateOfBirth, Age, ClassID, SectionID) 
VALUES ('Holistar',Null, 0, 8, 1) 
+10

如果您已经有DateOfBirth列,为什么还需要保留Age列? –

+2

如果你真的需要它作为一个单独的列,你可以把它作为一个计算列 –

+6

同意Zohar - 一般来说,不要*存储你可以计算的数据(除非计算是昂贵的,甚至在那里,内置到数据库系统中的工具,以便您不必手动执行计算) –

我希望这将帮助你找到你的解决方案

SELECT Name,Age = DATEDIFF(day,DateOfBirth,GETDATE()), 
[YEARS] = DATEDIFF(day,DateOfBirth,GETDATE())/365, 
[MONTHS] = (DATEDIFF(day,DateOfBirth,GETDATE()) % 365)/30, 
[DAYS] = (DATEDIFF(day,DateOfBirth,GETDATE()) % 365) % 30 
FROM Students 

AgeINTEGER所以你可以使用它,如果你这将给你在新年

UPDATE Students SET Age = DATEDIFF(day,DateOfBirth,GETDATE())/365 

Age得到更准确的答案,那么你可以使用

UPDATE Students SET Age = FLOOR(DATEDIFF(day, DateOfBirth, GETDATE())/365.242) 

Reference将帮助您计算闰年

+4

因为我们都知道每年正好包含365天? –

+1

谦虚的请求**下来选民**请留下评论,所以我可以找出问题,并尝试解决 – wiretext

+2

嗯,正如我所指出的 - 每四岁左右,这种计算变得不准确的一天,因为闰日。 –

虽然我不同意你的表同意,只要你想要的是:

update Students 
set Age = DATEDIFF(yy, DateOfBirth, GETDATE()) - CASE WHEN (MONTH(DateOfBirth) > MONTH(GETDATE())) OR (MONTH(DateOfBirth) = MONTH(GETDATE()) AND DAY(DateOfBirth) > DAY(GETDATE())) THEN 1 ELSE 0 END 
+1

不幸的是,'DATEDIFF'测量*转换*。 'DATEDIFF(year,'20131231','20140101')'返回1,即使只有一天过去了。 –

+0

@Damien_The_Unbeliever:你说得对。我的错。它是固定的。我仍然会使用计算列。 – CFreitas

而是具有列的,需要不断地更新。我会去计算列,我会用公式从这样一个问题:How to calculate age (in years) based on Date of Birth and getDate()

CREATE TABLE Students 
(
    ID INT IDENTITY 
    , Name VARCHAR(100) 
    , DateOfBirth DATE 
    , Age AS CONVERT(INT, ROUND(DATEDIFF(HOUR, DateOfBirth, GETDATE())/8766.0, 0)) 
    , ClassID INT 
    , SectionID INT 
    , PRIMARY KEY (ID) 
); 

到这一点,你的年龄一栏应始终保持最新。

+0

年龄“公式”不准确。你假设365,每年25天。 – CFreitas

+0

我引用了公式的SO问题。我最初的建议是使用计算列。而已。 –

+0

捣毁别人不应该的答案不是一个很好的借口。 –