Først tak for alle jeres svar. Ingen af dem, som de er, var en god løsning på mit problem, men for dit forsvar skal jeg tilføje, at jeg ikke opgav alle kravene. Men hver enkelt hjælper mig med at tænke over mit problem, og nogle af dine ideer er en del af min endelige løsning.
Så min endelige løsning på DB-siden er at bruge en varchar felt (begrænset til 10 tegn) og lagring af datoen i det, som en streng, i ISO-formatet (ÅÅÅÅ-MM-DD) med 00 for måned og dag, når der ikke er nogen måned og/eller dag (som en dato felt i MySQL). På denne måde kan dette felt fungere med alle databaser, dataene kan læses, forstås og redigeres direkte og nemt af et menneske ved hjælp af en simpel klient (som mysql-klient, phpmyadmin, osv.). Det var et krav. Det kan også eksporteres til Excel/CSV uden nogen form for konvertering osv. Ulempen er, at formatet ikke håndhæves (undtagen i Django). Nogen kunne skrive 'ikke en date' eller lav en fejl i formatet, og DB vil acceptere det (hvis du har en idé om dette problem...).
På denne måde er det også muligt at gøre alt det særlige forespørgsler på en dato felt relativt nemt. For forespørgsler med WHERE:<,>, <=,>=og =virker direkte. IN- og MELLEM-forespørgslerne virker også direkte. For at forespørge efter dag eller måned skal du blot gøre det med EXTRACT (DAY|MONTH ...). Bestilling af arbejde også direkte. Så jeg tror, det dækker alle forespørgselsbehov og stort set uden komplikationer.
På Django-siden gjorde jeg 2 ting. Først har jeg oprettet en PartialDate
objekt, der mest ligner datetime.date
men understøttende dato uden måned og/eller dag. Inde i dette objekt bruger jeg et datetime.datetime objekt til at beholde datoen. Jeg bruger timer og minutter som flag, der fortæller, om måneden og dagen er gyldige, når de er sat til 1. Det er den samme idé, som steveha foreslå, men med en anden implementering (og kun på klientsiden). Brug af en datetime.datetime
objekt giver mig en masse gode funktioner til at arbejde med datoer (validering, sammenligning osv.).
For det andet har jeg oprettet et PartialDateField
der for det meste omhandler konverteringen mellem PartialDate
objektet og databasen.
Indtil videre fungerer det ret godt (jeg har for det meste afsluttet mine omfattende enhedstests).