Bereich:
Es gibt immer den offensichtlichen Nachteil:Der Bereich, den Sie speichern können, ist von 1970 bis 2038 begrenzt. Wenn Sie Daten außerhalb dieses Bereichs speichern müssen, müssen Sie im Allgemeinen ein anderes Format verwenden. Der häufigste Fall, den ich gefunden habe, wo dies zutrifft, betrifft Geburtsdaten.
Lesbarkeit:
Ich denke, dass der wichtigste Grund, warum sich Leute für einen der integrierten Datumstypen entschieden haben, darin besteht, dass die Daten einfacher zu interpretieren sind. Sie können einfach auswählen und die Werte verstehen, ohne die Antwort weiter formatieren zu müssen.
Indizes:
Ein guter technischer Grund für die Verwendung der Datumstypen besteht darin, dass sie in einigen Fällen eine indizierte Abfrage ermöglichen, die Unix-Zeitstempel nicht bieten. Betrachten Sie die folgende Abfrage:
SELECT * FROM tbl WHERE year(mydate_field) = 2009;
Wenn mydate_field ein nativer Datumstyp ist und es einen Index für das Feld gibt, verwendet diese Abfrage trotz des Funktionsaufrufs tatsächlich einen Index. Dies ist so ziemlich das einzige Mal, dass mysql Funktionsaufrufe für solche Felder optimieren kann. Die entsprechende Abfrage für ein Zeitstempelfeld kann keine Indizes verwenden:
SELECT * FROM tbl WHERE year(from_unixtime(mytimestamp_field)) = 2009;
Wenn Sie ein wenig darüber nachdenken, gibt es jedoch einen Weg, es zu umgehen. Diese Abfrage macht dasselbe und wird in der Lage sein, Indexoptimierungen zu verwenden:
SELECT * FROM tbl WHERE mytimestamp_field > unix_timestamp("2009-01-01") AND mytimestamp_field < unix_timestamp("2010-01-01");
Berechnungen:
Im Allgemeinen speichere ich Daten trotz der Nachteile als Unix-Zeit. Das liegt nicht wirklich an seinen Vorzügen, sondern daran, dass ich daran gewöhnt bin. Ich habe festgestellt, dass dies einige Berechnungen vereinfacht, andere jedoch erschwert. Beispielsweise ist es sehr schwierig, einem Unix-Zeitstempel einen Monat hinzuzufügen, da die Anzahl der Sekunden pro Monat variiert. Dies ist sehr einfach mit der mysql-Funktion DATE_ADD(). Ich denke jedoch, dass es in den meisten Fällen die Berechnungen vereinfacht. Beispielsweise ist es durchaus üblich, dass Sie beispielsweise die Beiträge der letzten zwei Tage auswählen möchten. Wenn das Feld einen Unix-Zeitstempel enthält, kann dies einfach durch Folgendes geschehen:
SELECT * FROM tbl WHERE mytimestamp_field > time() - 2*24*3600;
Es ist wahrscheinlich Geschmackssache, aber ich persönlich finde das schneller und einfacher, als mir die Syntax einer Funktion wie DATE_SUB() merken zu müssen.
Zeitzonen:
Unix-Zeitstempel können keine Zeitzonendaten speichern. Ich lebe in Schweden, das eine einzige Zeitzone hat, also ist das kein wirkliches Problem für mich. Es kann jedoch sehr mühsam sein, wenn Sie in einem Land leben, das sich über mehrere Zeitzonen erstreckt.