2012-02-09 5 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つのテストケースでは-1を返し続けます。私はこれをMSSQLでうまく動作させていますが、MySQLはやや使い勝手が悪いです。

ここに何か不足していますか?何が取引、助けてください!あなたの日付は、別のフォーマットである場合には(私は 'ネイティブ' フォーマットあなたはそれを維持するために助言する:

おかげ

+1

check datediff function – Alfabravo

+0

なぜ、あなたはmysqlの日付形式を使用していませんか?それをネイティブで保存するのはちょうど...非効率的です。あなたのテーブル構造を変更することは可能ですか? – Vyktor

+0

私のデザインVykではありません。 MySQLについて何も知らなかったのは私の前のばかだった。だから私はそれに固執していますが、私は今働いています。 – Encryption

答えて

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

+0

@Encryptionアップデートをお試しください。 – Cheery

+0

Thanks Cheery!これらの変更を同じようにしようとしていたのですが、それはMySQLの非形式形式で保存されているので、現時点ではうまくいきません:(それに対処してください) – Encryption

2

あなたはdatediff()

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

動作しません。ちょうどNULLを返します。 DATEDIFF(DATE_FORMAT(curdate()、 '%m-%d-%Y')、date_of_birth) – Encryption

+0

DATEDIFFは日数の差を返します – Cheery

+0

date_of_birthでdate_formatを行い、それが機能するかどうかを確認してください。私はオラクルで知っている、日付として格納されたフィールドでさえ気まずいことができ、私は日付としてそれをとにかくキャストしなければならなかった。両方の日付をマスキングして、データベースがリンゴとリンゴを比較するようにしてください。 – Brian