Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como lidar com datas parciais (2010-00-00) do MySQL no Django?


Primeiramente, obrigado por todas as suas respostas. Nenhum deles, como está, foi uma boa solução para o meu problema, mas, para sua defesa, devo acrescentar que não dei todos os requisitos. Mas cada um me ajuda a pensar no meu problema e algumas de suas ideias fazem parte da minha solução final.

Então, minha solução final, no lado do banco de dados, é usar um varchar campo (limitado a 10 caracteres) e armazenando a data nele, como uma string, no formato ISO (AAAA-MM-DD) com 00 para mês e dia quando não há mês e/ou dia (como uma data campo no MySQL). Desta forma, este campo pode trabalhar com qualquer banco de dados, os dados podem ser lidos, entendidos e editados direta e facilmente por um humano usando um cliente simples (como cliente mysql, phpmyadmin, etc.). Isso era uma exigência. Também pode ser exportado para Excel/CSV sem nenhuma conversão, etc. A desvantagem é que o formato não é aplicado (exceto no Django). Alguém poderia escrever 'não é um encontro' ou faça um erro no formato e o BD vai aceitar (se você tiver uma ideia sobre esse problema...).

Dessa forma, também é possível fazer todas as tarefas especiais consultas de uma data campo com relativa facilidade. Para consultas com WHERE:<,>, <=,>=e =trabalhe diretamente. As consultas IN e BETWEEN também funcionam diretamente. Para consultar por dia ou mês basta fazê-lo com EXTRACT (DAY|MONTH...). Encomendar trabalho também diretamente. Então eu acho que cobre todas as necessidades de consulta e na maioria das vezes sem complicação.

No lado do Django, fiz 2 coisas. Primeiro, criei um PartialDate objeto que se parece principalmente com datetime.date mas data de suporte sem mês e/ou dia. Dentro deste objeto eu uso um objeto datetime.datetime para manter a data. Estou usando as horas e minutos como sinalizadores que informam se o mês e o dia são válidos quando definidos como 1. É a mesma ideia que steveha propor, mas com uma implementação diferente (e apenas no lado do cliente). Usando um datetime.datetime object me dá muitos recursos interessantes para trabalhar com datas (validação, comparação, etc.).

Em segundo lugar, criei um PartialDateField que lidam principalmente com a conversão entre o PartialDate objeto e o banco de dados.

Até agora, funciona muito bem (eu terminei principalmente meus extensos testes de unidade).