sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo lidiar con fechas parciales (2010-00-00) de MySQL en Django?

Primero, gracias por todas sus respuestas. Ninguno de ellos, tal cual, fue una buena solución para mi problema, pero, para su defensa, debo agregar que no di todos los requisitos. Pero cada uno me ayuda a pensar en mi problema y algunas de sus ideas son parte de mi solución final.

Entonces, mi solución final, en el lado de la base de datos, es usar un varchar (limitado a 10 caracteres) y almacenar la fecha en él, como una cadena, en el formato ISO (AAAA-MM-DD) con 00 para mes y día cuando no hay mes y/o día (como una fecha campo en MySQL). De esta manera, este campo puede funcionar con cualquier base de datos, los datos pueden ser leídos, entendidos y editados directa y fácilmente por un humano usando un cliente simple (como mysql client, phpmyadmin, etc.). Ese era un requisito. También se puede exportar a Excel/CSV sin ninguna conversión, etc. La desventaja es que el formato no se aplica (excepto en Django). Alguien podría escribir 'no es una fecha' o comete un error en el formato y la base de datos lo aceptará (si tienes una idea sobre este problema...).

De esta forma también es posible hacer todas las especiales consultas de una fecha campo con relativa facilidad. Para consultas con DONDE:<,>, <=,>=y =funcionan directamente. Las consultas IN y BETWEEN también funcionan directamente. Para consultar por día o mes solo hay que hacerlo con EXTRACTO (DÍA|MES...). Pedidos de trabajo también directamente. Así que creo que cubre todas las necesidades de consulta y casi sin complicaciones.

En el lado de Django, hice 2 cosas. Primero, he creado una PartialDate objeto que se parece principalmente a datetime.date pero fecha de apoyo sin mes y/o día. Dentro de este objeto utilizo un objeto datetime.datetime para mantener la fecha. Estoy usando las horas y los minutos como indicadores que indican si el mes y el día son válidos cuando se establecen en 1. Es la misma idea que steveha proponer pero con una implementación diferente (y solo en el lado del cliente). Usando un datetime.datetime object me brinda muchas características interesantes para trabajar con fechas (validación, comparación, etc.).

En segundo lugar, he creado un PartialDateField que se ocupan principalmente de la conversión entre PartialDate objeto y la base de datos.

Hasta ahora, funciona bastante bien (la mayoría de las veces he terminado mis extensas pruebas unitarias).