MySQL Datetime Versus Timestamp Datatyper

De tidsmässiga datatyperna i MySQL kan vara förvirrande. Förhoppningsvis hjälper detta exempel och diskussion till att förklara skillnaderna mellan tidstämpel och datetime.

Från MySQL-referensen:

DATETIME-typen används för värden som innehåller både datum och tid. MySQL hämtar och visar DATETIME-värden i formatet "ÅÅÅÅ-MM-DD HH: MM: SS". Det stödda intervallet är '1000-01-01 00:00:00' till '9999-12-31 23:59:59'.

TIMESTAMP-datatypen används för värden som innehåller både datum- och tidsdelar. TIMESTAMP har ett urval av '1970-01-01 00:00:01' UTC till '2038-01-19 03:14:07' UTC.

En stor skillnad mellan dessa två datatyper är att TIMESTAMP datatypvärden omvandlas från nuvarande tidszon till UTC för lagringsändamål och konverteras tillbaka från UTC till aktuell tidszon när den används. Datetime-datatypens värden är oförändrade i förhållande till tidszonen.

Detta exempel är en bra övning för att visa skillnaden mellan dessa två datatyper.

mysql> visa variabler som '% time_zone%'; + ------------------ + --------------------- + | Variabelnamn | Värde | + ------------------ + --------------------- + | system_time_zone | Indien Standard Time | | time_zone | Asien / Calcutta | + ------------------ + --------------------- + 2 rader i set (0,00 sek)


Du kan se vår nuvarande tidszoninformation. Låt oss skapa en tabell med de två datatyperna under denna miljö och fyll i den med samma tidsmässiga information.

skapa tabelldateemo (mydatetime datetime, mytimestamp timestamp); Fråga OK, 0 rader påverkas (0,05 sek)
infoga i datedemo värden ((nu ()), (nu ())); Fråga OK, 1 rader påverkad (0,02 sek)
välj * från datedemo; + --------------------- + --------------------- + | mydatetime | mytimestamp | + --------------------- + --------------------- + | 2011-08-21 14:11:09 | 2011-08-21 14:11:09 | + --------------------- + --------------------- + 1 rad i set ( 0,00 sek)


Vid denna tidpunkt har datatypen och tidstämpeldatatyperna förblivit exakt samma värden. Låt oss ändra tidszonen se resultaten.

SET TIME_ZONE = "america / new_york"; Fråga OK, 0 rader påverkas (0,00 sek)
 välj * från datedemo; + --------------------- + --------------------- + | mydatetime | mytimestamp | + --------------------- + --------------------- + | 2011-08-21 14:11:09 | 2011-08-21 04:41:09 | + --------------------- + --------------------- + 1 rad i set ( 0,00 sek)


Ovanstående exempel visar hur TIMESTAMP-datumtypen ändrade värdena efter att ha ändrat tidszonen till 'america / new_work' där DATETIME är oförändrad.