# Age Calculation

I store the user’s date of birth in my database table, and I have a function in my User model which calculates the user’s age. This is all good and well when retrieving the user’s age, but what about when I want to query the database for users of a specific age, or users between two specific ages?

What is the correct method of doing this? How do I code this in CDbCriteria?

I would probably store the age as a separate field and have it updated somehow (script running on crontab or similar). That way you could easily do such queries.

Best way for that is eg.user is 11-12-1987 like me and the second one is 11-12-1988

AGE is name of your date of birth column

``````

\$user = User::model()->findAll(array(

'criteria'=>array(

'select'=>'user',

'condition'=>'WHERE AGE BETWEEN \'1987-12-11\' AND \'1988-12-11\' '

)

));

``````

I don’t think this is the best but this should working

the age between 5 to 10 for example

\$min=10;

\$max=5;

``````

\$criteria=new CDbCriteria();

\$criteria->condition='dateOfBirth between :minAge and :maxAge';

\$criteria->params=array(':minAge'=>date('Y-m-d', mktime(0, 0, 0, date("m") , date("d"), date("Y") - \$minAge)), ':maxAge'=>date('Y-m-d', mktime(0, 0, 0, date("m") , date("d"), date("Y") - \$maxAge)));

\$userList=User::model()->findAll(\$criteria);

``````

i think best way for me

To store the age is not a great idea, you have just to manke 2 calculation in php.

For example you can use strtotime for create the dates for search:

``````

\$criteria->params=array(

':minAge'=> date('Y-m-d',strtotime("- {\$this->min_age} years"),

':maxAge'=> date('Y-m-d',strtotime("- {\$this->max_age} years"));

<?php echo)?>

``````

This funcion will work correctly even with month or days intervals

``````

\$criteria->condition = 'timestampdiff( year, birthday, curdate( ) ) > 33'

``````

timestampdiff is mysql only

http://blog.mbischof.de/alter-berechnen