Types de données MySQL datetime et timestamp

Les types de données temporels dans MySQL peuvent être déroutants. Espérons que cet exemple et cette discussion aideront à expliquer les différences entre les types de données timestamp et datetime.

De la référence MySQL:

Le type DATETIME est utilisé pour les valeurs contenant à la fois des parties de date et d’heure. MySQL récupère et affiche les valeurs DATETIME au format 'AAAA-MM-JJ HH: MM: SS. La plage prise en charge est «1000-01-01 00:00:00» à «9999-12-31 23:59:59».

Le type de données TIMESTAMP est utilisé pour les valeurs contenant à la fois des parties de date et d'heure. TIMESTAMP a une plage de '1970-01-01 00:00:01' UTC à '2038-01-19 03:14:07' UTC.

Une différence majeure entre ces deux types de données réside dans le fait que les valeurs de type de données TIMESTAMP sont converties du fuseau horaire actuel en UTC à des fins de stockage et reconverties d’UTC en fuseau horaire actuel lorsqu’elles sont utilisées. Les valeurs de type de données datetime sont inchangées par rapport au fuseau horaire.

Cet exemple est un bon exercice pour démontrer la différence entre ces deux types de données.

mysql> affiche des variables comme '% time_zone%'; + ------------------ + --------------------- + | Nom_variable | La valeur | + ------------------ + --------------------- + | system_time_zone | Heure normale de l'Inde | | time_zone | Asia / Calcutta | + ------------------ + --------------------- + 2 lignes dans le jeu (0.00 sec)


Vous pouvez voir nos informations de fuseau horaire actuel. Sous cet environnement, créons une table avec les deux types de données et remplissons-la avec les mêmes informations temporelles.

créer une table datemo (mydatetime datetime, timestamp mytimestamp); Requête OK, 0 ligne affectée (0.05 sec)
insérer dans les valeurs du date ((now ()), (now ())); Requête OK, 1 ligne affectée (0.02 sec)
Sélectionnez * parmi Date + --------------------- + --------------------- + | mydatetime | mon horodatage | + --------------------- + --------------------- + | 2011-08-21 14:11:09 | 2011-08-21 14:11:09 | + --------------------- + --------------------- + 1 ligne dans le jeu ( 0.00 sec)


À ce stade, les types de données datetime et timestamp sont restés exactement les mêmes valeurs. Laissez-nous changer le fuseau horaire voir les résultats.

SET TIME_ZONE = "america / new_york"; Requête OK, 0 ligne affectée (0.00 sec)
 Sélectionnez * parmi Date + --------------------- + --------------------- + | mydatetime | mon horodatage | + --------------------- + --------------------- + | 2011-08-21 14:11:09 | 2011-08-21 04:41:09 | + --------------------- + --------------------- + 1 ligne dans le jeu ( 0.00 sec)


L'exemple ci-dessus montre comment le type de date TIMESTAMP a modifié les valeurs après avoir défini le fuseau horaire sur 'america / new_work', où DATETIME est inchangé.