Interval:
Der er altid den åbenlyse ulempe:Udvalget, du kan gemme, er begrænset fra 1970 til 2038. Hvis du har brug for at gemme datoer uden for dette interval, skal du generelt bruge et andet format. Det mest almindelige tilfælde, jeg har fundet, hvor dette gælder, er fødselsdatoer.
Læsbarhed:
Jeg tror, at den vigtigste grund til, at folk valgte at bruge en af de indbyggede datotyper, er, at dataene er nemmere at fortolke. Du kan foretage et simpelt valg og forstå værdierne uden at skulle formatere svaret yderligere.
Indekser:
En god teknisk grund til at bruge datotyperne er, at det tillader indekseret forespørgsel i nogle tilfælde, som unix-tidsstempler ikke gør. Overvej følgende forespørgsel:
SELECT * FROM tbl WHERE year(mydate_field) = 2009;
Hvis mitdato_felt er af en oprindelig datotype, og der er et indeks på feltet, vil denne forespørgsel faktisk bruge et indeks på trods af funktionskaldet. Dette er stort set den eneste gang, mysql kan optimere funktionskald på felter som dette. Den tilsvarende forespørgsel på et tidsstempelfelt vil ikke kunne bruge indekser:
SELECT * FROM tbl WHERE year(from_unixtime(mytimestamp_field)) = 2009;
Hvis du tænker lidt over det, er der dog en vej udenom. Denne forespørgsel gør det samme, og vil kunne bruge indeksoptimeringer:
SELECT * FROM tbl WHERE mytimestamp_field > unix_timestamp("2009-01-01") AND mytimestamp_field < unix_timestamp("2010-01-01");
Beregninger:
Generelt gemmer jeg datoer som unix-tid, på trods af ulemperne. Dette er ikke rigtig baseret på dets fordele, men det er snarere fordi jeg er vant til det. Jeg har fundet ud af, at dette forenkler nogle beregninger, men komplicerer andre. For eksempel er det meget svært at tilføje en måned til et unix-tidsstempel, da antallet af sekunder pr. måned varierer. Dette er meget nemt ved at bruge mysql DATE_ADD()-funktionen. Jeg tror dog, at det i de fleste tilfælde faktisk forenkler beregningerne. For eksempel er det ret almindeligt, at du vil vælge indlæg fra for eksempel de sidste to dage. Hvis feltet indeholder et unix-tidsstempel, kan dette nemt gøres ved blot at gøre:
SELECT * FROM tbl WHERE mytimestamp_field > time() - 2*24*3600;
Det er nok en smagssag, men jeg synes personligt, at det er hurtigere og nemmere end at skulle huske syntaksen for en funktion såsom DATE_SUB().
Tidszoner:
Unix-tidsstempler kan ikke gemme tidszonedata. Jeg bor i sverige, som har en enkelt tidszone, så dette er egentlig ikke et problem for mig. Det kan dog være en stor smerte, hvis du bor i et land, der spænder over flere tidszoner.