459 votes

Dans Ruby on Rails, quelle est la différence entre DateTime, Timestamp, Time et Date ?

D'après mon expérience, il est toujours dangereux et difficile d'obtenir des dates et des heures exactes lors de la programmation.

Ruby et Rails m'ont toujours échappé sur ce point, ne serait-ce qu'en raison du nombre écrasant d'options ; je n'ai jamais la moindre idée de ce que je dois choisir.

Lorsque j'utilise Rails et que je consulte les types de données ActiveRecord, je trouve les éléments suivants

:datetime, :timestamp, :time, et :date

et je n'ai aucune idée des différences ou des problèmes qui se posent.

Quelle est la différence ? Comment les utilisez-vous ?

(P.S. J'utilise Rails3)

0 votes

Je pense qu'une partie de la confusion vient aussi du fait que la ActiveRecord ne correspondent pas aux types Ruby (par ex. DateTime ) et Rails superpose même d'autres types (ex. TimeWithZone ).

632voto

vonconrad Points 14378

La différence entre les différents formats de date et d'heure dans ActiveRecord a peu à voir avec Rails et tout à voir avec la base de données que vous utilisez.

En utilisant MySQL comme exemple (ne serait-ce que parce que c'est le plus populaire), vous avez DATE , DATETIME , TIME et TIMESTAMP types de données de colonne ; tout comme vous avez CHAR , VARCHAR , FLOAT et INTEGER .

Alors, demandez-vous, quelle est la différence ? Eh bien, certaines d'entre elles sont explicites. DATE enregistre uniquement une date, TIME ne mémorise qu'une heure de la journée, tandis que DATETIME les deux magasins.

La différence entre DATETIME et TIMESTAMP est un peu plus subtile : DATETIME est formaté comme suit YYYY-MM-DD HH:MM:SS . Les plages valides vont de l'an 1000 à l'an 9999 (et tout ce qui se trouve entre les deux). Alors que TIMESTAMP regarde similaire lorsque vous le récupérez dans la base de données, il s'agit en fait d'une façade pour un horodatage unix . Sa plage de validité va de 1970 à 2038. La différence ici, en dehors des diverses fonctions intégrées dans le moteur de base de données, est l'espace de stockage. Comme DATETIME stocke tous les chiffres de l'année, du mois, du jour, de l'heure, des minutes et des secondes, ce qui représente un total de 8 octets. Comme TIMESTAMP ne stocke que le nombre de secondes depuis le 01-01-1970, il utilise 4 octets.

Vous pouvez lire plus sur les différences entre les formats de temps dans MySQL ici .

En fin de compte, tout dépend de ce que vous voulez faire avec votre colonne de date et d'heure :

  • Vous avez besoin de stocker des dates et des heures avant 1970 ou après 2038 ? => Utilisation DATETIME .
  • Avez-vous besoin de vous soucier de la taille de la base de données et vous êtes dans cette fourchette de temps ? => Utilisation TIMESTAMP .
  • Avez-vous seulement besoin de stocker une date ? => Utiliser DATE .
  • Avez-vous seulement besoin de mémoriser une heure ? => Utiliser TIME .

Ayant dit tout cela, En fait, Rails prend certaines de ces décisions à votre place. . Les deux sites :timestamp et :datetime sera par défaut DATETIME alors que :date et :time correspond à DATE et TIME respectivement.

Cela signifie qu'au sein de Rails, il vous suffit de décider si vous devez stocker la date, l'heure ou les deux.

8 votes

Pour mémoire, je préfère les timestamps absolus (unix) car le format YYYY-MM-DD dépend du fuseau horaire utilisé. Le client doit donc connaître le fuseau horaire du serveur et doit effectuer des conversions. Les horodatages absolus Seconds-since-1970 n'ont pas ce problème.

37 votes

@n13 Bon point, mais pas vraiment un problème dans Rails, puisqu'il convertit en UTC avant d'insérer les dates dans la base de données.

15 votes

C'est l'un des articles les plus utiles de l'univers Rails. Il devrait être ajouté au guide Rails...

36voto

mingca Points 282
  1. :datetime (8 octets)

    • Enregistre la date et l'heure au format AAAA-MM-JJ HH:MM:SS
    • Utile pour les colonnes comme birth_date
  2. :timestamp (4 octets)

    • Enregistre le nombre de secondes depuis 1970-01-01
    • Utile pour les colonnes comme updated_at, created_at
  3. :date (3 octets)
    • Date du magasin
  4. :temps (3 octets)
    • Heure des magasins

5 votes

Il s'agit plutôt de la version TL:DR de la réponse acceptée ci-dessus.

3voto

Voici une impressionnante et précis explication que j'ai trouvée.

TIMESTAMP utilisé pour suivre les changements d'enregistrements, et mis à jour chaque fois que l'enregistrement est modifié. DATETIME est utilisé pour stocker une valeur spécifique et statique spécifique et statique qui n'est pas affectée par les changements d'enregistrements.

TIMESTAMP est également affecté par les différents paramètres liés à la ZONE HORAIRE. DATETIME est constant.

TIMESTAMP convertit en interne un fuseau horaire actuel en UTC pour le stockage, et, lors de la récupération, convertit à nouveau le fuseau horaire actuel. DATETIME ne peut pas faire cela.

TIMESTAMP est de 4 octets et DATETIME de 8 octets.

TIMESTAMP plage supportée : '1970-01-01 00:00:01 UTC à '2038-01-19 03:14:07 UTC DATETIME plage supportée : '1000-01-01 00:00:00 à '9999-12-31 23:59:59

source : https://www.dbrnd.com/2015/09/difference-between-datetime-and-timestamp-in-mysql/#:~:text=DATETIME%20vs%20TIMESTAMP%3A,DATETIME%20est%20constant .

Aussi...

avec différents types de colonnes "date" et types de migration de rails correspondants selon la base de données.

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