在看過先前那麼多篇關於日期計算的討論之後,這次我們要討論最簡單的日期計算,那就是如何計算出年齡。
這個問題看似很簡單,但是相信看過這篇討論之後,您就會覺得事實絕非如我們所想見的這麼單純!
如果資料表中,有個出生日期的欄位,一般都不會再特別加上一個「年齡」的欄位,原因是因為透過 T-SQL 就可以算出來,所以不需要額外佔用一個欄位:
-- 自訂一個 DATETIME 型別的變數
DECLARE @myDate as DATETIME
-- 指定日期變數
SET @myDate = '19880907'
-- 以「年」為單位計算出年齡
SELECT DATEDIFF(yy, @myDate, getdate()) as 年齡
執行結果如下:
上面的程式邏輯看似沒問題,但是,假設有人在前一年的年底出生,請問當我們快樂地跨完新的一年之後,這個人的年齡應該是多少?
1 歲?還是 0 歲?
就中國人的虛歲來看,是 1 歲沒錯,但是如果牽扯到錢的計算,那可就不能馬虎地胡亂計算一通了。因為還沒到新的一年的年底,所以還是要當成 0 歲來計算。
透過下面這段程式碼,我們可以看出上面這樣的計算方式是錯誤的!
-- 宣告變數
DECLARE @myDate DATETIME, @today DATETIME
-- 指定日期變數
SET @myDate = '20081231'
SET @today = '20090101'
-- 以「年」為單位計算出年齡
SELECT DATEDIFF(yy, @myDate, @today) 年齡
執行結果如下:
之所以錯誤是因為 DATEDIFF() 計算出來的是這兩個日期之間,差了多少年,而非實際上,這兩個日期之間的年數(也就是年齡),所以要改寫成下面這樣:
-- 宣告變數
DECLARE @myDate DATETIME, @age int, @day DATETIME
-- 指定日期變數
SET @myDate = '19880907'
-- 以「年」為單位計算出年齡
SET @age = DATEDIFF(yy, @myDate, getdate()) -
CASE WHEN @day < DATEADD(yy, DATEDIFF(yy, @myDate, @day), @myDate)
THEN 1
ELSE 0
SELECT @age 年齡
以兩個生日做驗證「20120505」與「20120910」
很明顯可以看出帶入之後 20120505 應為0歲, 20120910 應為1歲,
但結果卻不然,兩者運行之後結果皆為 1,
由此可知您並未做資料驗算,錯得相當離譜。