如何在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)
我希望这将帮助你找到你的解决方案
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
你Age
列INTEGER
所以你可以使用它,如果你这将给你在新年
UPDATE Students SET Age = DATEDIFF(day,DateOfBirth,GETDATE())/365
Age
得到更准确的答案,那么你可以使用
UPDATE Students SET Age = FLOOR(DATEDIFF(day, DateOfBirth, GETDATE())/365.242)
这Reference将帮助您计算闰年
因为我们都知道每年正好包含365天? –
谦虚的请求**下来选民**请留下评论,所以我可以找出问题,并尝试解决 – wiretext
嗯,正如我所指出的 - 每四岁左右,这种计算变得不准确的一天,因为闰日。 –
虽然我不同意你的表同意,只要你想要的是:
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
不幸的是,'DATEDIFF'测量*转换*。 'DATEDIFF(year,'20131231','20140101')'返回1,即使只有一天过去了。 –
@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)
);
到这一点,你的年龄一栏应始终保持最新。
如果您已经有DateOfBirth列,为什么还需要保留Age列? –
如果你真的需要它作为一个单独的列,你可以把它作为一个计算列 –
同意Zohar - 一般来说,不要*存储你可以计算的数据(除非计算是昂贵的,甚至在那里,内置到数据库系统中的工具,以便您不必手动执行计算) –