MySQL Datetime Versus Timestamp Tipi di dati

I tipi di dati temporali in MySQL possono confondere. Si spera che questo esempio e questa discussione contribuiscano a spiegare le differenze nei tipi di data / ora e data / ora.

Dal riferimento MySQL:

Il tipo DATETIME viene utilizzato per i valori che contengono parti di data e ora. MySQL recupera e visualizza i valori DATETIME nel formato 'AAAA-MM-GG HH: MM: SS'. L'intervallo supportato è '1000-01-01 00:00:00' su '9999-12-31 23:59:59'.

Il tipo di dati TIMESTAMP viene utilizzato per i valori che contengono parti di data e ora. TIMESTAMP ha un intervallo di '1970-01-01 00:00:01' UTC in '2038-01-19 03:14:07' UTC.

Una differenza importante tra questi due tipi di dati è che i valori del tipo di dati TIMESTAMP vengono convertiti dal fuso orario corrente in UTC per scopi di archiviazione e convertiti da UTC al fuso orario corrente quando utilizzato. I valori del tipo di dati datetime sono invariati in relazione al fuso orario.

Questo esempio è un buon esercizio per dimostrare la differenza tra questi due tipi di dati.

mysql> mostra variabili come '% time_zone%'; + ------------------ + --------------------- + | Variable_name | Valore | + ------------------ + --------------------- + | system_time_zone | India Standard Time | | time_zone | Asia / Calcutta | + ------------------ + --------------------- + 2 righe nel set (0,00 secondi)


Puoi vedere le nostre attuali informazioni sul fuso orario. In questo ambiente, creiamo una tabella con i due tipi di dati e la popoliamo con le stesse informazioni temporali.

creare la tabella datedemo (mydatetime datetime, mytimestamp timestamp); Query OK, 0 righe interessate (0.05 sec)
inserire in valori datedemo ((now ()), (now ())); Domanda OK, 1 riga interessata (0,02 secondi)
seleziona * da datedemo; + --------------------- + --------------------- + | mydatetime | mytimestamp | + --------------------- + --------------------- + | 2011-08-21 14:11:09 | 2011-08-21 14:11:09 | + --------------------- + --------------------- + 1 riga in set ( 0,00 secondi)


A questo punto i tipi di dati datetime e timestamp sono rimasti gli stessi identici valori. Cerchiamo di cambiare il fuso orario vedere i risultati.

SET TIME_ZONE = "america / new_york"; Query OK, 0 righe interessate (0,00 secondi)
 seleziona * da datedemo; + --------------------- + --------------------- + | mydatetime | mytimestamp | + --------------------- + --------------------- + | 2011-08-21 14:11:09 | 2011-08-21 04:41:09 | + --------------------- + --------------------- + 1 riga in set ( 0,00 secondi)


L'esempio sopra mostra come il tipo di data TIMESTAMP ha cambiato i valori dopo aver cambiato il fuso orario in 'america / new_work' dove DATETIME è invariato.