sql >> Databasteknik >  >> RDS >> Mysql

MySQL-datum eller PHP-tid?

Omfång:

Det finns alltid den uppenbara nackdelen:Utbudet som du kan lagra är begränsat från 1970 till 2038. Om du behöver lagra datum utanför detta intervall måste du vanligtvis använda ett annat format. Det vanligaste fallet jag har hittat där detta gäller är födelsedatum.

Läsbarhet:

Jag tror att den viktigaste anledningen till att folk valde att använda en av de inbyggda datumtyperna är att data är lättare att tolka. Du kan göra ett enkelt val och förstå värdena utan att behöva formatera svaret ytterligare.

Index:

En bra teknisk anledning att använda datumtyperna är att det tillåter indexerad fråga i vissa fall som unix-tidsstämplar inte gör det. Tänk på följande fråga:

SELECT * FROM tbl WHERE year(mydate_field) = 2009;

Om mydate_field är av en ursprunglig datumtyp och det finns ett index på fältet, kommer denna fråga faktiskt att använda ett index, trots funktionsanropet. Detta är i stort sett den enda gången som mysql kan optimera funktionsanrop på fält som detta. Motsvarande fråga i ett tidsstämpelfält kommer inte att kunna använda index:

SELECT * FROM tbl WHERE year(from_unixtime(mytimestamp_field)) = 2009;

Om du tänker på det lite så finns det dock en väg runt det. Den här frågan gör samma sak och kommer kunna använda indexoptimeringar:

SELECT * FROM tbl WHERE mytimestamp_field > unix_timestamp("2009-01-01") AND mytimestamp_field < unix_timestamp("2010-01-01");

Beräkningar:

I allmänhet lagrar jag datum som unix-tid, trots nackdelarna. Det här är egentligen inte baserat på dess förtjänster, utan snarare för att jag är van vid det. Jag har upptäckt att detta förenklar vissa beräkningar, men komplicerar andra. Det är till exempel väldigt svårt att lägga till en månad till en unix-tidsstämpel eftersom antalet sekunder per månad varierar. Detta är mycket enkelt att använda mysql DATE_ADD()-funktionen. Jag tror dock att det i de flesta fall faktiskt förenklar beräkningar. Det är till exempel ganska vanligt att man vill välja inläggen från till exempel de senaste två dagarna. Om fältet innehåller en unix-tidsstämpel kan detta enkelt göras genom att helt enkelt göra:

SELECT * FROM tbl WHERE mytimestamp_field > time() - 2*24*3600;

Det är nog en smaksak, men jag tycker personligen att det är snabbare och enklare än att behöva komma ihåg syntaxen för en funktion som DATE_SUB().

Tidszoner:

Unix-tidsstämplar kan inte lagra tidszonsdata. Jag bor i sverige som har en enda tidszon, så det här är egentligen inget problem för mig. Det kan dock vara en stor smärta om du bor i ett land som sträcker sig över flera tidszoner.



  1. Yii2 - vänster koppling på flera villkor

  2. PostgreSQL namnkonventioner

  3. IN vs ALLA operatör i PostgreSQL

  4. Introduktion av vanliga tabelluttryck i SQL Server