sql >> Database >  >> RDS >> Mysql

Hoe om te gaan met gedeeltelijke datums (2010-00-00) van MySQL in Django?

Allereerst bedankt voor al je antwoorden. Geen van hen, zoals het is, was een goede oplossing voor mijn probleem, maar voor uw verdediging moet ik eraan toevoegen dat ik niet alle vereisten heb gegeven. Maar ze helpen me allemaal om over mijn probleem na te denken en sommige van uw ideeën maken deel uit van mijn uiteindelijke oplossing.

Dus mijn uiteindelijke oplossing, aan de DB-kant, is om een ​​varchar . te gebruiken veld (beperkt tot 10 tekens) en de datum erin op te slaan, als een string, in het ISO-formaat (JJJJ-MM-DD) met 00 voor maand en dag wanneer er geen maand en/of dag is (zoals een datum veld in MySQL). Op deze manier kan dit veld met alle databases werken, de gegevens kunnen direct en gemakkelijk worden gelezen, begrepen en bewerkt door een mens met behulp van een eenvoudige client (zoals mysql-client, phpmyadmin, enz.). Dat was een vereiste. Het kan ook geëxporteerd worden naar Excel/CSV zonder enige conversie, enz. Het nadeel is dat het formaat niet afgedwongen wordt (behalve in Django). Iemand kan 'geen afspraakje' write schrijven of maak een fout in het formaat en de database zal het accepteren (als je een idee hebt over dit probleem...).

Op deze manier is het ook mogelijk om alle speciale . te doen zoekopdrachten van een datum relatief gemakkelijk veld. Voor queries met WHERE:<,>, <=,>=en =werk direct. De IN- en BETWEEN-query's werken ook direct. Voor het opvragen per dag of maand hoeft u dit alleen maar te doen met EXTRACT (DAY|MONTH ...). Werk ook direct bestellen. Dus ik denk dat het alle vraagbehoeften dekt en meestal zonder complicaties.

Aan de Django-kant deed ik 2 dingen. Eerst heb ik een PartialDate . gemaakt object dat er grotendeels uitziet als datetime.date maar ondersteunende datum zonder maand en/of dag. Binnen dit object gebruik ik een datetime.datetime object om de datum te behouden. Ik gebruik de uren en minuten als vlag die aangeven of de maand en de dag geldig zijn wanneer ze zijn ingesteld op 1. Het is hetzelfde idee dat steveha voorstellen, maar met een andere implementatie (en alleen aan de klantzijde). Een datetime.datetime gebruiken object geeft me veel leuke functies om met datums te werken (validatie, vergelijking, enz.).

Ten tweede heb ik een PartialDateField . gemaakt die meestal te maken hebben met de conversie tussen de PartialDate object en de database.

Tot nu toe werkt het redelijk goed (ik heb mijn uitgebreide unittests grotendeels afgerond).



  1. SQL Inner Join

  2. Hoe de LCASE()-functie werkt in MySQL

  3. JSON-gegevens opslaan in mysql

  4. Inzicht in Dirty Read-probleem met SQL Server