Předem děkuji za všechny vaše odpovědi. Žádný z nich, jak je, nebyl dobrým řešením mého problému, ale na vaši obranu bych měl dodat, že jsem neuvedl všechny požadavky. Ale každý z nich mi pomůže přemýšlet o mém problému a některé z vašich nápadů jsou součástí mého konečného řešení.
Takže moje konečné řešení na straně DB je použít varchar pole (omezeno na 10 znaků) a uložení data do něj jako řetězce ve formátu ISO (RRRR-MM-DD) s 00 pro měsíc a den, kdy není uveden žádný měsíc a/nebo den (například datum pole v MySQL). Tímto způsobem může toto pole pracovat s libovolnými databázemi, data lze číst, chápat a upravovat přímo a jednoduše člověkem pomocí jednoduchého klienta (jako mysql klient, phpmyadmin atd.). To byl požadavek. Lze jej také exportovat do Excelu/CSV bez jakékoli konverze apod. Nevýhodou je nevynucování formátu (kromě Django). Někdo by mohl napsat 'není datum' nebo udělejte chybu ve formátu a DB to přijme (pokud máte představu o tomto problému...).
Tímto způsobem je také možné provádět všechny speciální dotazy na datum pole poměrně snadno. Pro dotazy s WHERE:<,>, <=,>=a =pracují přímo. Přímo fungují také dotazy IN a BETWEEN. Chcete-li dotazovat podle dne nebo měsíce, stačí to udělat pomocí EXTRACT (DAY|MONTH ...). Objednávání práce také přímo. Takže si myslím, že pokrývá všechny potřeby dotazů a většinou bez komplikací.
Na straně Djanga jsem udělal 2 věci. Nejprve jsem vytvořil PartialDate
objekt, který vypadá většinou jako datetime.date
ale podpůrné datum bez měsíce a/nebo dne. Uvnitř tohoto objektu používám objekt datetime.datetime k uchování data. Hodiny a minuty používám jako příznak, který říká, zda je měsíc a den platný, když jsou nastaveny na 1. Je to stejný nápad jako steveha navrhnout, ale s jinou implementací (a pouze na straně klienta). Pomocí datetime.datetime
object mi dává spoustu pěkných funkcí pro práci s daty (validace, porovnávání atd.).
Za druhé, vytvořil jsem PartialDateField
které se většinou zabývají převodem mezi PartialDate
objekt a databáze.
Zatím to funguje docela dobře (většinou jsem dokončil své rozsáhlé testy jednotek).