web-dev-qa-db-fra.com

Quand utiliser date / heure ou horodatage

J'ai cherché cela, mais pas de réponses claires (surtout sur ce dernier). Dans quels cas devriez-vous utiliser une date/heure ou un horodatage?

68
James P.

En supposant que vous utilisez MS SQL Server (ce que vous n'êtes pas, voir la mise à jour ci-dessous ):

Une table ne peut avoir qu'une seule colonne d'horodatage. La valeur de la colonne timestamp est mise à jour chaque fois qu'une ligne contenant une colonne timestamp est insérée ou mise à jour. Cette propriété fait qu'une colonne d'horodatage est un mauvais candidat pour les clés, en particulier les clés primaires. Toute mise à jour de la ligne modifie la valeur de l'horodatage, modifiant ainsi la valeur de la clé. Si la colonne est dans une clé primaire, l'ancienne valeur de clé n'est plus valide et les clés étrangères faisant référence à l'ancienne valeur ne sont plus valides. Si la table est référencée dans un curseur dynamique, toutes les mises à jour modifient la position des lignes dans le curseur. Si la colonne est dans une clé d'index, toutes les mises à jour de la ligne de données génèrent également des mises à jour de l'index.

Informations sur MSDN

Si vous devez stocker des informations de date/heure sur une ligne et ne pas modifier cette date/heure, utilisez DateTime. sinon, utilisez Horodatage.

Remarque: Les champs d'horodatage de MS SQL Server ne sont pas des dates ni des heures, ils sont des représentations binaires de la séquence relative du moment où les données ont été modifiées.

Mise à jour

Comme vous l'avez mis à jour pour dire MySQL:

Les valeurs TIMESTAMP sont converties du fuseau horaire actuel en UTC pour le stockage, puis reconverties d’UTC vers le fuseau horaire actuel pour être extraites. (Cela se produit uniquement pour le type de données TIMESTAMP, pas pour d'autres types tels que DATETIME.)

Citation de référence MySQL

Plus particulièrement:

Si vous stockez une valeur TIMESTAMP, puis modifiez le fuseau horaire et récupérez la valeur, la valeur extraite est différente de la valeur que vous avez stockée.

Par conséquent, si vous utilisez une application sur plusieurs fuseaux horaires et que vous avez besoin d'une date/heure reflétant les paramètres de chaque utilisateur, utilisez l'horodatage. Si vous avez besoin de cohérence quel que soit le fuseau horaire, utilisez Date/heure.

66
Jaymz

Voir Devrais-je utiliser le champ 'datetime' ou 'timestamp'?? Il couvre de manière exhaustive le sujet.

EDIT - Juste pour résumer les propriétés de MySQL et mon expérience avec lui-

Horodatage -

a) 4 octets par colonne (contre 8 pour datetime)

  • LOWER RANGE ('1970-01-01 00:00:01' UTC à '2038-01-09 03:14:07' UTC) THAN DATETIME - Ne l'utilisez donc pas pour les dates de naissance, etc. fournit en fait un "horodatage" de "MAINTENANT" pour des activités telles que les mises à jour de rangées, etc.

b) stocké en interne sous forme d'entier

  • Sur le plan des performances, mon expérience personnelle a été ambiguë. Parfois, c'est plus rapide, parfois plus lent que DATETIME. Cela prend moins de place cependant.

c) A des informations sur le fuseau horaire!

  • donc - si j'ajoute '2011-01-01 3:30' dans TIMESTAMP (avec le fuseau horaire Curr comme EST - Boston) .. plus tard, je change le fuseau horaire du serveur et mysql en PST (Californie) et redémarre le serveur - la valeur changera to '2011-01-01 00:00' - (S'IL VOUS PLAÎT CONFIRMER ... je l'avais testé il y a longtemps). Cependant, DATETIME restera le même.

d) Toutes les fonctions DATE ()/DAY ()/MONTH () fonctionnent à la fois pour TIMESTAMP et DATETIME

e) Dans MySQL, vous pouvez avoir plusieurs TIMESTAMPS par table

  • (OUI, cependant un seul d'entre eux (le premier) sera mis à jour automatiquement avec l'heure de la mise à jour de la ligne, également ... un seul peut être défini sur NOT NULL (pensez le premier))

f) le premier TIMESTAMP d'une table est automatiquement mis à jour ...

  • soyez donc prudent si vous l'utilisez à d'autres fins .. et que vous souhaitez y autoriser les valeurs NULL. (null stocké sous le nom "0000-00-00 00:00:00" dans DATETIME et TIMESTAMP)

J'ai utilisé plusieurs horodatages à d'autres fins. J'avais besoin de gagner de la place (je devais faire très attention et garder toutes ces questions à l'esprit.

Mon conseil, optez pour TIMESTAMP à des fins autres que l’horodatage, si vous savez ce que vous faites. Et si SPACE est une préoccupation majeure (par exemple, 15 000 000 de lignes et de plus en plus nombreuses et 8 fois!))

30
Jai

Je n'ai pas bien compris votre question, mais voyez le lien ci-dessous. cela peut vous aider

http://www.sqlteam.com/article/timestamps-vs-datetime-data-types

5
Bhushan Kawadkar
  • En MySQL, sur DateTime type, vous pouvez travailler avec les fonctions associées à DATE(), alors que sur timestamp vous ne pouvez pas.
  • Timestamp ne peut pas contenir de valeurs avant 01-01-1970.
  • En outre, l’un d’eux tient l’économie d’été et l’autre pas (je ne me souviens plus lequel).

J'ai tendance à toujours choisir DateTime.

2
Tudor Constantin

Besoin de spécifier le serveur de base de données.

Certains moteurs de serveur mettront automatiquement à jour les champs d'horodatage, de sorte qu'il puisse être utilisé comme version d'enregistrement dans Optimistic Locking

2
sehe