3031 votes

Dois-je utiliser le type de données datetime ou timestamp dans MySQL ?

Recommanderiez-vous d'utiliser un datetime ou un horodatage et pourquoi (en utilisant MySQL) ?

Je travaille avec PHP du côté serveur.

2 votes

Ce site contient des informations pertinentes codeproject.com/Tips/1215635/MySQL-DATETIME-vs-TIMESTAMP

5 votes

Si vous voulez que votre application soit cassée en février 2038, utilisez timestamp. Vérifiez la plage de dates.

0 votes

S'il y a la moindre chance que votre base de données doive stocker des valeurs dans un autre fuseau horaire ou recevoir des connexions d'une application dans un autre fuseau horaire, envisagez d'utiliser les CHARs ISO-8601 pour tous vos horodatages importants. Voir cette question : stackoverflow.com/questions/40670532/

2053voto

blivet Points 7106

Les horodatages dans MySQL sont généralement utilisés pour suivre les modifications des enregistrements, et sont souvent mis à jour chaque fois que l'enregistrement est modifié. Si vous souhaitez stocker une valeur spécifique, vous devez utiliser un champ date.

Si vous voulez dire que vous devez choisir entre l'utilisation d'un timestamp UNIX ou d'un champ datetime natif de MySQL, optez pour le format natif. Vous pouvez effectuer des calculs dans MySQL de cette manière ("SELECT DATE_ADD(my_datetime, INTERVAL 1 DAY)") et il est simple de changer le format de la valeur en un timestamp UNIX ("SELECT UNIX_TIMESTAMP(my_datetime)") lors de l'interrogation de l'enregistrement si vous voulez opérer sur celui-ci avec PHP.

1133 votes

Une différence importante est que DATETIME représente une date (telle qu'on la trouve dans un calendrier) et une heure (telle qu'on peut l'observer sur une horloge murale), alors que TIMESTAMP représente un moment bien défini dans le temps. Cela peut être très important si votre application gère des fuseaux horaires. Combien de temps s'est écoulé depuis '2010-09-01 16:31:00' ? Cela dépend du fuseau horaire dans lequel vous vous trouvez. Pour moi, c'était il y a quelques secondes, pour vous, cela peut représenter un moment dans le futur. Si je dis 1283351460 secondes depuis '1970-01-01 00:00:00 UTC', vous savez exactement de quel moment je parle. (Voir l'excellente réponse de Nir ci-dessous). [Inconvénient : plage de validité].

135 votes

Une autre différence : les requêtes avec une date "native" ne seront pas mises en cache, mais les requêtes avec un timestamp le seront.

54 votes

"Les timestamps dans MySQL sont généralement utilisés pour suivre les modifications des enregistrements" Je ne pense pas que ce soit une bonne réponse. Les timestamps sont beaucoup plus puissants et compliqués que cela, comme l'ont dit MattBianco et Nird. Cependant, la deuxième partie de la réponse est très bonne. C'est vrai ce que blivet a dit, et c'est un bon conseil.

1028voto

Nir Points 8003

Dans MySQL 5 et plus, TIMESTAMP sont converties du fuseau horaire actuel en UTC pour le stockage, et reconverties de l'UTC au fuseau horaire actuel pour la récupération. (Ceci ne se produit que pour le type de données TIMESTAMP, et no pour d'autres types tels que DATETIME).

Par défaut, le fuseau horaire actuel pour chaque connexion est l'heure du serveur. Le fuseau horaire peut être défini pour chaque connexion, comme décrit dans la section suivante. Support du fuseau horaire du serveur MySQL .

15 votes

Cette présentation d'OReilly est très bonne pour ce sujet (PDF désolé) cdn.oreillystatic.com/fr/assets/1/event/36/

19 votes

Il s'agit également de la nature de l'événement : - Une vidéoconférence (TIMESTAMP). Tous les participants doivent voir une référence à un instant absolu de temps ajusté à son fuseau horaire. - Une heure de tâche locale (DATETIME), je dois effectuer cette tâche à 9h00 le 31 mars 2014, peu importe si ce jour-là je travaille à New York ou à Paris. Je commencerai à travailler à 8h00 de l'heure locale du lieu où je serai ce jour-là.

0 votes

Oui, et c'est juste horrible. Le SGBD ne devrait jamais, au grand jamais, convertir les horodatages dans n'importe quelle direction ni prendre en compte l'heure système de la BD actuelle. Il devrait simplement enregistrer l'horodatage interne tel qu'il est (ms depuis l'époque). Lors du rendu de la valeur (au tout dernier moment), la valeur devrait être présentée ( !) dans le fuseau horaire de l'utilisateur à partir de l'application. Tout le reste n'est que pure souffrance. S'il y en a, le SGBD devrait supporter des types explicites pour le temps local et absolu, où "local" est quelque chose comme votre anniversaire ou "midi" et "absolu" est quelque chose comme l'heure de départ d'une fusée.

595voto

scronide Points 5108

J'utilise toujours des champs DATETIME pour tout ce qui n'est pas des métadonnées de ligne (date de création ou de modification).

Comme mentionné dans la documentation MySQL :

Le type DATETIME est utilisé lorsque vous avez besoin de valeurs qui contiennent à la fois des informations sur la date et l'heure. MySQL récupère et affiche les valeurs DATETIME au format 'YYYY-MM-DD HH:MM:SS'. La plage prise en charge va de '1000-01-01 00:00:00' à '9999-12-31 23:59:59'.

...

Le type de données TIMESTAMP est compris entre '1970-01-01 00:00:01' UTC et '2038-01-09 03:14:07' UTC. Ses propriétés varient en fonction de la version de MySQL et du mode SQL utilisé par le serveur.

Il est fort probable que vous atteigniez la limite inférieure des TIMESTAMPs utilisés en général -- par exemple pour stocker la date de naissance.

227 votes

Vous pouvez également appuyer sur la touche supérieur limite facilement si vous êtes dans la banque ou l'immobilier... Les hypothèques de 30 ans vont au-delà de 2038 maintenant

22 votes

Bien sûr, utilisez des timestamps Unix 64 bits. Par exemple, en Java, new Date().getTime() vous donne déjà une valeur de 64 bits.

13 votes

Aucune idée. C'est un problème bien plus important que MySQL et il n'y a pas de solution simple : fr.wikipedia.org/wiki/problème de l'année 2038 Je ne pense pas que MySQL puisse simplement déclarer que les timestamps sont désormais 64 bits et supposer que tout ira bien. Ils ne contrôlent pas le matériel.

365voto

mr_eclair Points 9503

Les exemples ci-dessous montrent comment l TIMESTAMP le type de date a changé les valeurs après avoir modifié le time-zone to 'america/new_york'DATETIME est inchangé.

mysql> show variables like '%time_zone%';
+------------------+---------------------+
| Variable_name    | Value               |
+------------------+---------------------+
| system_time_zone | India Standard Time |
| time_zone        | Asia/Calcutta       |
+------------------+---------------------+

mysql> create table datedemo(
    -> mydatetime datetime,
    -> mytimestamp timestamp
    -> );

mysql> insert into datedemo values ((now()),(now()));

mysql> select * from datedemo;
+---------------------+---------------------+
| mydatetime          | mytimestamp         |
+---------------------+---------------------+
| 2011-08-21 14:11:09 | 2011-08-21 14:11:09 |
+---------------------+---------------------+

mysql> set time_zone="america/new_york";

mysql> select * from datedemo;
+---------------------+---------------------+
| mydatetime          | mytimestamp         |
+---------------------+---------------------+
| 2011-08-21 14:11:09 | 2011-08-21 04:41:09 |
+---------------------+---------------------+

J'ai converti ma réponse en article afin que plus de personnes puissent trouver cette information utile, MySQL : Types de données Datetime et Timestamp .

79 votes

Eh bien, en fait, le DATETIME L'heure effective a changé avec le changement de fuseau horaire, TIMESTAMP n'a pas changé, mais la représentation humaine, oui.

219voto

ekerner Points 1664

La principale différence réside dans le fait que DATETIME est constant alors que TIMESTAMP est affecté par la méthode de calcul de la date. time_zone réglage.

Cela n'a donc d'importance que lorsque vous avez - ou pourriez avoir à l'avenir - des clusters synchronisés sur plusieurs fuseaux horaires.

En termes plus simples : Si j'ai une base de données en Australie, et que je fais une vidange de cette base de données pour synchroniser/peupler une base de données en Amérique, alors le TIMESTAMP sera mis à jour pour refléter l'heure réelle de l'événement dans le nouveau fuseau horaire, tandis que le DATETIME reflétera toujours l'heure de l'événement dans le fuseau horaire de l'Australie. .

Un excellent exemple d'utilisation de DATETIME là où TIMESTAMP aurait dû être utilisé est celui de Facebook, dont les serveurs ne sont jamais tout à fait sûrs de l'heure à laquelle les choses se sont produites dans les différents fuseaux horaires. Une fois, j'ai eu une conversation au cours de laquelle l'heure indiquait que je répondais à des messages avant que le message ne soit réellement envoyé. (Cela aurait pu, bien sûr, être causé par une mauvaise traduction des fuseaux horaires dans le logiciel de messagerie si les heures étaient affichées plutôt que synchronisées).

99 votes

Je ne pense pas que ce soit une bonne façon de penser. Je me contenterais de stocker et de traiter toutes les dates en UTC et de m'assurer que le frontal les affiche en fonction du fuseau horaire donné. Cette approche est simple et prévisible.

9 votes

@Kos : le stockage et le traitement de toutes les dates en UTC n'est-il pas exactement ce que TIMESTAMP fait en interne ? (Puis le convertir pour afficher votre fuseau horaire local ?)

11 votes

mon le fuseau horaire local ? Comment votre base de données pourrait-elle connaître mon fuseau horaire ? ;-) Il y a normalement un certain nombre de traitements entre la base de données et l'interface utilisateur. Je ne fais la localisation qu'après tout ce processus.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X