2014-06-07 22 views
5

Ho un campo dob nella mia tabella MySQL che è di tipo date. Solo un piccolo, banale esempio è qualcosa di simile:Calcolare l'età con i decimali dalla data di nascita

mysql> select dob from players limit 5; 
+------------+ 
| dob  | 
+------------+ 
| 1983-12-02 | 
| 1979-01-01 | 
| 1989-05-11 | 
| 1976-03-24 | 
| 1989-09-12 | 
+------------+ 

Sto cercando di calcolare le età con punti decimali utilizzando la data odierna. Quindi, tecnicamente, se il tuo compleanno è il 1 giugno 1981 o il 1981-06-01, questo ti fa 33 e oggi è il 7 giugno .. Sarai 33.(6/365) or 33.02 years old. Qual è il modo più semplice per calcolare questo usando SQL?

risposta

5

solito calcolo DOB ​​è abbastanza facile in MySQL, quando si vuole calcolare gli anni senza alcuna frazione qualcosa di

mysql> select timestampdiff(YEAR,'1981-06-01',now()); 
+----------------------------------------+ 
| timestampdiff(YEAR,'1981-06-01',now()) | 
+----------------------------------------+ 
|          33 | 
+----------------------------------------+ 

Ma dal momento che hai bisogno della frazione anche questo dovrebbe fare il trucco

mysql> select format(datediff(curdate(),'1981-06-01')/365.25,2); 
+-----------------------------------------------------+ 
| format(datediff(curdate(),'1981-06-01')/365.25,2) | 
+-----------------------------------------------------+ 
| 33.02            | 
+-----------------------------------------------------+ 

L'anno è considerato 365,25 giorni.

Quindi nel tuo caso si possono avere la query come

select 
format(datediff(curdate(),dob)/365.25,2) as dob 
from players limit 5; 
+1

+1 Semplice e diretto – Andomar

+0

Se solo gli anni erano 365,25 giorni. –

1

È possibile utilizzare la funzione to_days per calcolare i giorni compresi tra l'anno zero e il compleanno di qualcuno. Quindi sottrarre da oggi quel numero di giorni. Che dovrebbe darvi il compleanno come se qualcuno è nato negli anni zero:

select year(subdate(now(), to_days(dob))) 

Example at SQL Fiddle.

1

La cosa migliore è l'uso di DATEDIFF() come segue:

select datediff(NOW(),date("1983-12-02"))/365;

dove la data indicata è il campo della data, quindi il tuo esempio verrebbe tradotto in:

select datediff(NOW(),date(dob))/365 from players limit 5;

Il risultato viene restituito sarebbe il numero di anni a partire dalla data di nascita a 4 cifre decimali. Se si preferisce due cifre decimali usano truncate() come segue:

truncate(datediff(NOW(),date("1983-12-02"))/365,2);

1

Ci sono un paio di questioni. stai usando 365 come il numero di giorni in un anno e ignorando gli anni bisestili. Il modo più semplice per farlo sarebbe

select datediff(now(), '1981-06-01')/365.25; 

Quando si utilizza 365,25 si diffonderà l'anno bisestile e si dovrebbe andare bene. MySQL dice che questo valore è 33.0157. quando lo arrotondi a due decimali dovresti stare bene.

Problemi correlati