Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie gehe ich mit Teildaten (2010-00-00) von MySQL in Django um?

Erstmal danke für all eure Antworten. Keiner von ihnen war so wie er ist eine gute Lösung für mein Problem, aber zu Ihrer Verteidigung sollte ich hinzufügen, dass ich nicht alle Anforderungen erfüllt habe. Aber jeder hilft mir, über mein Problem nachzudenken, und einige Ihrer Ideen sind Teil meiner endgültigen Lösung.

Meine endgültige Lösung auf der DB-Seite ist also die Verwendung eines varchar Feld (begrenzt auf 10 Zeichen) und darin das Datum als String im ISO-Format (JJJJ-MM-TT) mit 00 speichern für Monat und Tag, wenn es keinen Monat und/oder Tag gibt (wie ein Datum Feld in MySQL). Auf diese Weise kann dieses Feld mit beliebigen Datenbanken arbeiten, die Daten können direkt und einfach von einem Menschen mit einem einfachen Client (wie mysql-Client, phpmyadmin usw.) gelesen, verstanden und bearbeitet werden. Das war eine Vorgabe. Es kann auch ohne Konvertierung usw. nach Excel/CSV exportiert werden. Der Nachteil ist, dass das Format nicht durchgesetzt wird (außer in Django). Jemand könnte 'kein Datum' schreiben oder machen Sie einen Fehler im Format und die DB wird es akzeptieren (wenn Sie eine Idee zu diesem Problem haben...).

Auf diese Weise ist es auch möglich, das ganze Spezial zu machen Abfragen eines Datums Feld relativ leicht. Für Abfragen mit WHERE:<,>, <=,>=und =funktionieren direkt. Die IN- und BETWEEN-Abfragen funktionieren auch direkt. Für die Abfrage nach Tag oder Monat müssen Sie dies nur mit EXTRACT (DAY|MONTH ...) tun. Auftragsarbeiten auch direkt. Ich denke also, dass es alle Abfrageanforderungen abdeckt und das meistens ohne Komplikationen.

Auf der Django-Seite habe ich zwei Dinge getan. Zuerst habe ich ein PartialDate erstellt Objekte, die meistens wie datetime.date aussehen aber unterstützendes Datum ohne Monat und/oder Tag. Innerhalb dieses Objekts verwende ich ein datetime.datetime-Objekt, um das Datum zu speichern. Ich verwende die Stunden und Minuten als Flags, die angeben, ob der Monat und der Tag gültig sind, wenn sie auf 1 gesetzt sind. Es ist die gleiche Idee wie bei steveha vorschlagen, aber mit einer anderen Implementierung (und nur auf der Client-Seite). Verwenden eines datetime.datetime Objekt gibt mir viele nette Features für die Arbeit mit Daten (Validierung, Vergleich, etc.).

Zweitens habe ich ein PartialDateField erstellt die sich hauptsächlich mit der Konvertierung zwischen dem PartialDate befassen Objekt und die Datenbank.

Bisher funktioniert es ziemlich gut (ich habe meistens meine umfangreichen Unit-Tests abgeschlossen).