Exibindo e Inserindo data/hora no Postgres

Trabalhar com o tempo em bancos de dados não é moleza. O volume de erros cometidos é absurdamente grande. Difícil de imaginar algumas barberagens que a gente encontra por aí. Eu sei, muitos SGDBs não implementam tipos básicos como DATE, TIME, TIMESTAMP e INTERVAL do mesmo jeito. O estes tipos de dados foram definidos no ISO92, mas por razões históricas ou por incompetência mesmo, muitos não se ajustaram ao padrão. Por sorte, o Postgres tem ótima compatibilidade a quase todos os requisitos padrão ISO.

Bom, a confusão toda começa em se entender que ao se tratar do tempo, não interessa a forma como você vai exibir e sim o significado da informação. Bancos de dados relacionais são fortemente tipados. Isto é desejável se você quer garantir a integridade das informações. Isto ajuda na hora de indexar e recuperar a informação de forma velóz com base em critérios de seleção complexos. Isto ajuda a entender de forma mais clara o modelo de dados que você utiliza.

Então, dizer apenas ’92’ não me diz se você está falando do ano 1992, de 92 segundos, de 92 horas, 92 séculos, etc. Então, não importa de que forma você pretende exibir os dados, insira num formato mais padronizado possível. Se todas as pessoas armazenassem datas no formado ano/mês/dia o universo seria um lugar melhor. Mas cada um tem a mania de fazer isso num formato diferente. E você pode exibir datas no formato que quiser, mas se tem juízo, deveria sempre usar o mesmo formato:

Note que não interessa se você acertou ou não os parâmetros DateStyle:

Também não muda se você ajustar o lc_time:

Se você quiser saber exatamente como pode inserir data/hora no Postgres, as regras de interpretação do Postgres estão bem documentadas, mas existe ainda um último recurso para situações mais delicadas. Se você recebe os dados num formato específico, você pode forçar a interpretação correta do mesmo:

Agora podemos exibir do jeito que a gente quiser a informação usando o nosso conhecido  to_char, e agora sim as variáveis de localização fazem algum efeito:

Opa, pera aí…. não funcionou. Sim, sim… tem uma pegadinha. Para ele traduzir, você precisa utilizar o prefixo TM. Note também que o seu sistema operacional tem de ter suporte para as diversas linguagens que você está utilizando. No meu caso eu ajustei o locales do meu Linux para suportar pt_BR, en_US, it_IT, es_ES e fr_FR:

OK, agora você pode trazer muito mais que isso. Existem várias opções de formatação disponíveis:

Bom, esta é só a ponta do Iceberg, inserir e exibir corretamente as datas. Estou prevendo pelo menos mais uns 2 posts para cobrir este vasto assunto um pouco melhor.

Até a próxima.

2 comentários sobre “Exibindo e Inserindo data/hora no Postgres

Dúvidas, sugestões, críticas, comentários e cervejas são bem vindos!!!