I have used CHAR and VARCHAR in the past, replacing the missing pieces with question marks or dashes. Question marks mean "not known", and dashes meant "not applicable". This proved to be intuitive enough for the users (secretaries and paralegals in complex litigation), flexible enough for the lawyers, and it sorted sensibly.

    "1964------"
    "1964-??-??"
    "1964-05---"
    "1964-05-??"
    "1964-05-02"
    "1964-06---"
    "1964-06-??"

Wrap your declaration and CHECK constraints in CREATE DOMAIN or CREATE TYPE to make maintenance easier. CREATE DOMAIN doesn't require additional coding. [CREATE TYPE][1] requires support functions written in a low-level language.


  [1]: http://www.postgresql.org/docs/current/static/sql-createtype.html