How to setup birthdate field with optional values
I would define 3 optional selects:
 - Year (now() to now() - 100)
 - Month (1-12)
 - Day (1-31)   

Then in a hook_node_validate() I would check if only the year is provided or a full date. Also don't forget to verify if the date is valid (like Feb, 31...) using checkdate( int $month , int $day , int $year ).

Then create a field template to either display the age or a birthdate.