Existem várias maneiras diferentes de abordar datas difusas. No PostgreSQL, você pode usar
- um par de colunas de data (earliest_possible_date, last_possible_date),
- uma coluna de data e uma coluna de precisão ('2012-01-01', 'year') ou
- um tipo de dados de intervalo (intervalo de datas) ou
- um varchar ('2013-01-2?', '2013-??-05') ou
- outra tabela ou tabelas com qualquer um desses tipos de dados.
O tipo de dados range é peculiar às versões recentes do PostgreSQL. Você pode usar os outros em qualquer dbms SQL.
O tipo de imprecisão de que você precisa depende do aplicativo. A forma como você consulta datas difusas depende de qual tipo de dados ou estrutura você escolhe. Você precisa ter uma compreensão firme sobre quais tipos de imprecisão você precisa armazenar e sobre o tipo de perguntas que seus usuários precisam responder. E você precisa testar para garantir que seu banco de dados possa responder às perguntas deles.
Por exemplo, em sistemas jurídicos as datas podem ser mal lembradas ou desfiguradas. Alguém pode dizer "Era uma quinta-feira de janeiro de 2014. Eu sei era uma quinta-feira, porque era dia de coleta de lixo", ou "Foi a primeira semana de junho ou julho do ano passado". Para registrar esse tipo de imprecisão, você precisa de outra mesa.
Ou um carimbo postal pode ser danificado para que você possa ler apenas "14, 2014". Você sabe que foi postado no dia 14, mas não sabe em que mês. Novamente, você precisa de outra mesa.
Alguns (todos?) deles não lhe darão lógica de três valores, a menos que você pule alguns obstáculos. ("Possível" não é um valor booleano válido.)