Rozsah:
Vždy je tu zřejmá nevýhoda:Rozsah, který můžete uložit, je omezený od roku 1970 do roku 2038. Pokud potřebujete ukládat data mimo tento rozsah, budete obecně muset použít jiný formát. Nejběžnějším případem, který jsem našel, kde se to týká, je datum narození.
Čitelnost:
Myslím, že nejdůležitějším důvodem, proč se lidé rozhodli použít jeden z vestavěných typů data, je snadnější interpretace dat. Můžete provést jednoduchý výběr a porozumět hodnotám, aniž byste museli odpověď dále formátovat.
Indexy:
Dobrým technickým důvodem pro použití typů data je to, že v některých případech umožňuje indexovaný dotaz, který unixová časová razítka neumožňují. Zvažte následující dotaz:
SELECT * FROM tbl WHERE year(mydate_field) = 2009;
Pokud je pole mydate_pole nativního typu data a pole obsahuje index, tento dotaz bude ve skutečnosti používat index, navzdory volání funkce. Toto je v podstatě jediný případ, kdy může mysql optimalizovat volání funkcí na polích, jako je toto. Odpovídající dotaz na pole časového razítka nebude moci používat indexy:
SELECT * FROM tbl WHERE year(from_unixtime(mytimestamp_field)) = 2009;
Pokud o tom trochu přemýšlíte, existuje způsob, jak to obejít. Tento dotaz dělá to samé a bude být schopen používat optimalizaci indexu:
SELECT * FROM tbl WHERE mytimestamp_field > unix_timestamp("2009-01-01") AND mytimestamp_field < unix_timestamp("2010-01-01");
Výpočty:
Obecně ukládám data jako unixový čas, navzdory nevýhodám. To není ve skutečnosti založeno na jeho přednostech, ale spíše proto, že jsem na to zvyklý. Zjistil jsem, že to některé výpočty zjednodušuje, ale jiné komplikuje. Například je velmi těžké přidat měsíc k časovému razítku unixu, protože počet sekund za měsíc se liší. To je velmi snadné pomocí funkce mysql DATE_ADD(). Myslím si však, že ve většině případů to vlastně výpočty zjednodušuje. Je například docela běžné, že chcete vybrat příspěvky řekněme za poslední dva dny. Pokud pole obsahuje unixové časové razítko, lze to snadno provést takto:
SELECT * FROM tbl WHERE mytimestamp_field > time() - 2*24*3600;
Je to pravděpodobně věc vkusu, ale osobně mi to přijde rychlejší a jednodušší, než si pamatovat syntaxi funkce, jako je DATE_SUB().
Časová pásma:
Časová razítka Unixu nemohou ukládat data časového pásma. Žiji ve Švédsku, které má jediné časové pásmo, takže to pro mě opravdu není problém. Pokud však žijete v zemi, která zahrnuje několik časových pásem, může to být velká bolest.