Първо, благодаря за всичките ви отговори. Нито един от тях, както е, не беше добро решение за моя проблем, но, за ваша защита, трябва да добавя, че не съм дал всички изисквания. Но всеки от тях ми помага да мисля за проблема си и някои от вашите идеи са част от окончателното ми решение.
Така че моето окончателно решение, от страна на DB, е да използвам varchar поле (ограничено до 10 знака) и съхраняване на датата в него, като низ, във формат ISO (ГГГГ-ММ-ДД) с 00 за месец и ден, когато няма месец и/или ден (като дата поле в MySQL). По този начин това поле може да работи с всякакви бази данни, данните могат да се четат, разбират и редактират директно и лесно от човек, използващ обикновен клиент (като mysql клиент, phpmyadmin и т.н.). Това беше изискване. Може също да се експортира в Excel/CSV без преобразуване и т.н. Недостатъкът е, че форматът не се прилага (освен в Django). Някой може да напише „не е среща“ или направете грешка във формата и БД ще я приеме (ако имате представа за този проблем...).
По този начин също така е възможно да направите всички специални заявки за дата поле сравнително лесно. За заявки с WHERE:<,>, <=,>=и =работят директно. Заявките IN и BETWEEN също работят директно. За заявка по ден или месец просто трябва да го направите с EXTRACT (ДЕН | МЕСЕЦ ...). Поръчване на работа също директно. Така че мисля, че покрива всички нужди от заявки и почти без усложнения.
От страна на Django направих 2 неща. Първо, създадох PartialDate
обект, който изглежда най-вече като datetime.date
но поддържаща дата без месец и/или ден. Вътре в този обект използвам обект datetime.datetime, за да запазя датата. Използвам часовете и минутите като флаг, който показва дали месецът и денят са валидни, когато са зададени на 1. Същата идея е, че steveha предложи, но с различна реализация (и само от страна на клиента). Използване на datetime.datetime
обектът ми дава много хубави функции за работа с дати (проверка, сравнение и т.н.).
Второ, създадох PartialDateField
които се занимават предимно с преобразуването между PartialDate
обект и базата данни.
Засега работи доста добре (завърших най-вече моите обширни тестове).