2012-02-09 47 views
3

我有一個date_of_birth字段的MySQL數據庫。存儲在此字段中的數據格式爲:MM-DD-YYYY。我需要計算此字段的年齡,因此我必須比較並取差值CurDate()MySQL日期問題 - 如何計算?

爲此,我寫了下面的:

select FLOOR((DATE_FORMAT(curdate(), '%m-%d-%Y') - date_of_birth)/10000) 
from patients 

因此,我希望它是比較MM-DD-YYYY的MM-DD-YYYY減去DOB的CurDate()。但是,對於我的一個測試用例,它繼續返回-1。我已經在MSSQL上正常工作了,但看起來MySQL更挑剔/不太友好。

我在這裏錯過了什麼嗎?什麼是交易,請幫助!

感謝

+1

check datediff函數 – Alfabravo 2012-02-09 19:47:16

+0

呃,爲什麼你不使用mysql日期格式?將其存儲在本地只是...效率低下。是否有可能改變你的表格結構? – Vyktor 2012-02-09 19:53:27

+0

這不是我的設計Vyk。這是我之前對白皮書一無所知的白癡。所以我一直堅持下來,但我現在就開始工作了。 – Encryption 2012-02-09 20:07:36

回答

4
SELECT DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(date_of_birth, '%Y') - 
     (DATE_FORMAT(NOW(), '00-%m-%d') < DATE_FORMAT(date_of_birth, '00-%m-%d')) 
     AS age 
FROM patients 

http://ma.tt/2003/12/calculate-age-in-mysql/

PS:如果你的日期是另一種格式(但我會建議你留着, '天然' 格式YYYY-MM-DD)然後

SELECT 
DATE_FORMAT(NOW(), '%Y') - 
       DATE_FORMAT(STR_TO_DATE(date_of_birth, '%m-%d-%Y'), '%Y') 
- (DATE_FORMAT(NOW(), '00-%m-%d') < 
       DATE_FORMAT(STR_TO_DATE(date_of_birth, '%m-%d-%Y'), '00-%m-%d')) 
    AS age 
FROM patients 
+0

仍然只是返回NULL。我的date_of_birth以MM-DD-YYYY格式存儲 - 這是絆腳石。 – Encryption 2012-02-09 19:54:26

+0

@Encryption嘗試更新。 – Cheery 2012-02-09 20:03:00

+0

謝謝Cheery!試圖做出同樣的修改..至於它被存儲在一個非常規的MySQL格式中,那麼在這一點上不能得到幫助:(必須處理它 – Encryption 2012-02-09 20:04:53

2

您可以使用datediff()

SELECT DATEDIFF(CURDATE(),date_of_birth) AS Age 
+0

不起作用。只是返回NULL。甚至試過使用DATEDIFF(DATE_FORMAT(curdate(),'%​​m-%d-%Y'),date_of_birth) – Encryption 2012-02-09 19:51:00

+0

DATEDIFF返回天差異 – Cheery 2012-02-09 19:51:44

+0

做date_format on date_of_birth並看看是否有效。我知道在oracle中,即使作爲日期存儲的字段也可能是古怪的,我不得不將它作爲日期進行投射。嘗試掩蓋兩個日期,以便數據庫比較蘋果和蘋果。 – Brian 2012-02-09 19:54:57