2015-10-13 119 views
-4

我需要編寫一個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 - 一般來說,不要*存儲你可以計算的數據(除非計算是昂貴的,甚至在那裏,內置到數據庫系統中的工具,以便您不必手動執行計算) –

回答

-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 

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

嗯,正如我所指出的 - 每四歲左右,這種計算變得不準確的一天,因爲閏日。 –

0

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

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

0

而是具有列的,需要不斷地更新。我會去計算列,我會用公式從這樣一個問題: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

搗毀別人不應該的答案不是一個很好的藉口。 –