sql >> Databasteknik >  >> RDS >> Mysql

Hur hanterar man partiella datum (2010-00-00) från MySQL i Django?

Först, tack för alla dina svar. Ingen av dem var som den är en bra lösning på mitt problem, men till ditt försvar bör jag tillägga att jag inte ställde alla krav. Men var och en hjälper mig att tänka på mitt problem och några av dina idéer är en del av min slutliga lösning.

Så min sista lösning, på DB-sidan, är att använda en varchar fältet (begränsat till 10 tecken) och lagrar datumet i det, som en sträng, i ISO-formatet (ÅÅÅÅ-MM-DD) med 00 för månad och dag när det inte finns någon månad och/eller dag (som ett datum fältet i MySQL). På så sätt kan detta fält fungera med alla databaser, data kan läsas, förstås och redigeras direkt och enkelt av en människa som använder en enkel klient (som mysql-klient, phpmyadmin, etc.). Det var ett krav. Det kan även exporteras till Excel/CSV utan någon konvertering etc. Nackdelen är att formatet inte tillämpas (förutom i Django). Någon skulle kunna skriva 'inte ett datum' eller gör ett misstag i formatet och DB kommer att acceptera det (om du har en idé om detta problem...).

På så sätt är det också möjligt att göra alla speciella frågor av ett datum fält relativt lätt. För frågor med WHERE:<,>, <=,>=och =fungerar direkt. IN- och MELLAN-frågorna fungerar också direkt. För att fråga efter dag eller månad behöver du bara göra det med EXTRACT (DAY|MONTH ...). Beställ arbete också direkt. Så jag tror att det täcker alla frågebehov och oftast utan komplikationer.

På Django-sidan gjorde jag 2 saker. Först har jag skapat en PartialDate objekt som mest ser ut som datetime.date men stöddatum utan månad och/eller dag. Inuti det här objektet använder jag ett datetime.datetime-objekt för att behålla datumet. Jag använder timmarna och minuterna som flagga som talar om om månaden och dagen är giltiga när de är inställda på 1. Det är samma idé som steveha föreslå men med en annan implementering (och endast på klientsidan). Använda en datetime.datetime objekt ger mig många fina funktioner för att arbeta med datum (validering, jämförelse, etc.).

För det andra har jag skapat ett PartialDateField som mestadels handlar om konverteringen mellan PartialDate objekt och databasen.

Hittills fungerar det ganska bra (jag har mestadels avslutat mina omfattande enhetstester).



  1. ORA-00904 Invalid identifier” för en identifierare i en group by-sats

  2. Försöker bygga en statisk databasklass som jag kan komma åt från vilken funktion som helst utanför klassen

  3. Börja blogga för HTML5 och CSS3

  4. Varning för användaren/local/mysql/datakatalogen ägs inte av mysql-användaren