Mysql
 sql >> Database >  >> RDS >> Mysql

Come gestire le date parziali (00-00-2010) da MySQL in Django?

Innanzitutto, grazie per tutte le tue risposte. Nessuno di loro, così com'è, era una buona soluzione al mio problema, ma, per tua difesa, devo aggiungere che non ho fornito tutti i requisiti. Ma ognuno mi aiuta a pensare al mio problema e alcune delle tue idee fanno parte della mia soluzione finale.

Quindi la mia soluzione finale, sul lato DB, è usare un varchar campo (limitato a 10 caratteri) e memorizzando in esso la data, come stringa, nel formato ISO (AAAA-MM-GG) con 00 per mese e giorno in cui non c'è mese e/o giorno (come una data campo in MySQL). In questo modo, questo campo può funzionare con qualsiasi database, i dati possono essere letti, compresi e modificati direttamente e facilmente da un essere umano utilizzando un semplice client (come mysql client, phpmyadmin, ecc.). Questo era un requisito. Può anche essere esportato in Excel/CSV senza alcuna conversione, ecc. Lo svantaggio è che il formato non è imposto (tranne in Django). Qualcuno potrebbe scrivere 'non una data' oppure fai un errore nel formato e il DB lo accetterà (se hai un'idea su questo problema...).

In questo modo è anche possibile fare tutti gli speciali query di una data campo relativamente facilmente. Per le query con WHERE:<,>, <=,>=e =funzionano direttamente. Anche le query IN e BETWEEN funzionano direttamente. Per interrogare per giorno o mese basta farlo con EXTRACT (DAY|MESSE...). Ordinazione del lavoro anche direttamente. Quindi penso che copra tutte le esigenze di query e per lo più senza complicazioni.

Sul lato Django, ho fatto 2 cose. Innanzitutto, ho creato un PartialDate oggetto che assomiglia principalmente a datetime.date ma data di supporto senza mese e/o giorno. All'interno di questo oggetto utilizzo un oggetto datetime.datetime per mantenere la data. Sto usando le ore e i minuti come flag che indicano se il mese e il giorno sono validi quando sono impostati su 1. È la stessa idea che steveha proporre ma con una diversa implementazione (e solo lato cliente). Utilizzando un datetime.datetime object mi offre molte caratteristiche interessanti per lavorare con le date (convalida, confronto, ecc.).

In secondo luogo, ho creato un PartialDateField che riguardano principalmente la conversione tra PartialDate oggetto e il database.

Finora funziona abbastanza bene (per lo più ho finito i miei test unitari estesi).