Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment gérer les dates partielles (2010-00-00) de MySQL dans Django ?

Tout d'abord, merci pour toutes vos réponses. Aucun d'entre eux, tel quel, n'était une bonne solution à mon problème, mais, pour votre défense, je dois ajouter que je n'ai pas donné toutes les exigences. Mais chacun m'aide à réfléchir à mon problème et certaines de vos idées font partie de ma solution finale.

Donc ma solution finale, côté DB, est d'utiliser un varchar (limité à 10 caractères) et y stockant la date, sous forme de chaîne, au format ISO (AAAA-MM-JJ) avec 00 pour le mois et le jour lorsqu'il n'y a pas de mois et/ou de jour (comme une date champ dans MySQL). De cette façon, ce champ peut fonctionner avec n'importe quelle base de données, les données peuvent être lues, comprises et éditées directement et facilement par un humain à l'aide d'un simple client (comme mysql client, phpmyadmin, etc.). C'était une exigence. Il peut également être exporté vers Excel/CSV sans aucune conversion, etc. L'inconvénient est que le format n'est pas appliqué (sauf dans Django). Quelqu'un pourrait écrire "pas une date" ou faites une erreur dans le format et la BD l'acceptera (si vous avez une idée sur ce problème...).

De cette façon, il est également possible de faire tous les spéciaux requêtes d'une date champ relativement facilement. Pour les requêtes avec WHERE :<,>, <=,>=et =fonctionnent directement. Les requêtes IN et BETWEEN fonctionnent également directement. Pour une requête par jour ou par mois il suffit de le faire avec EXTRACT (DAY|MONTH ...). Travail de commande aussi directement. Je pense donc qu'il couvre tous les besoins de requête et sans aucune complication.

Du côté de Django, j'ai fait 2 choses. Tout d'abord, j'ai créé un PartialDate objet qui ressemble principalement à datetime.date mais date justificative sans mois et/ou jour. À l'intérieur de cet objet, j'utilise un objet datetime.datetime pour conserver la date. J'utilise les heures et les minutes comme indicateur qui indique si le mois et le jour sont valides lorsqu'ils sont définis sur 1. C'est la même idée que steveha proposer mais avec une implémentation différente (et uniquement côté client). Utiliser un datetime.datetime l'objet me donne beaucoup de fonctionnalités intéressantes pour travailler avec les dates (validation, comparaison, etc.).

Deuxièmement, j'ai créé un PartialDateField qui traitent principalement de la conversion entre le PartialDate objet et la base de données.

Jusqu'à présent, cela fonctionne plutôt bien (j'ai pour la plupart terminé mes tests unitaires approfondis).