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

414

D'après mon expérience, obtenir des dates / heures correctes lorsque la programmation est toujours lourde de dangers et de difficultés.

Ruby et Rails m'ont toujours échappé sur celui-ci, ne serait-ce qu'en raison du nombre écrasant d'options; Je n'ai jamais aucune idée que je devrais choisir.

Lorsque j'utilise Rails et que je regarde les types de données ActiveRecord, je peux trouver les éléments suivants

: datetime,: timestamp,: time et: date

et n'ont aucune idée de ce que sont les différences ou où se cachent les gotchas.

Quelle est la différence? A quoi les utilisez-vous?

(PS j'utilise Rails3)

Nick May
la source

Réponses:

572

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

En utilisant MySQL comme un exemple (si pour aucune autre raison parce qu'il est le plus populaire), vous avez DATE, DATETIME, TIMEet les TIMESTAMPtypes de données de colonne; comme vous l' avez CHAR, VARCHAR, FLOATet INTEGER.

Alors, demandez-vous, quelle est la différence? Eh bien, certains d'entre eux sont explicites. DATEstocke uniquement une date, TIMEstocke uniquement une heure de la journée, tandis que DATETIMEstocke les deux.

La différence entre DATETIMEet TIMESTAMPest un peu plus subtile: DATETIMEest formatée en YYYY-MM-DD HH:MM:SS. Les plages valides vont de l'année 1000 à l'année 9999 (et tout le reste. Bien que cela TIMESTAMP semble similaire lorsque vous le récupérez dans la base de données, c'est vraiment juste un front pour un horodatage Unix . Sa plage valide va de 1970 à 2038. La différence ici, en plus des diverses fonctions intégrées dans le moteur de base de données, est l'espace de stockage. Parce qu'il DATETIMEstocke chaque chiffre de l'année, du mois, de l'heure, des minutes et des secondes, il utilise un total de 8 octets. Comme TIMESTAMPne stocke que le nombre de secondes depuis le 01/01/1970, il utilise 4 octets.

Vous pouvez en savoir plus sur les différences entre les formats d'heure dans MySQL ici .

En fin de compte, cela revient à ce que vous avez besoin de votre colonne date / heure. Avez-vous besoin de stocker des dates et heures avant 1970 ou après 2038? Utilisez DATETIME. Avez-vous besoin de vous soucier de la taille de la base de données et vous êtes dans cette plage horaire? Utilisez TIMESTAMP. Avez-vous seulement besoin de stocker une date? Utilisez DATE. Avez-vous seulement besoin de stocker un temps? Utilisez TIME.

Cela dit, Rails prend en fait certaines de ces décisions pour vous . Les deux :timestampet :datetimeseront par défaut DATETIME, tandis que :dateet :timecorrespond à DATEet TIME, respectivement.

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

vonconrad
la source
7
Pour mémoire, je préfère les horodatages absolus (unix) car le format AAAA-MM-JJ dépend du fuseau horaire utilisé. Le client doit donc connaître le fuseau horaire du serveur et effectuer des conversions. Les horodatages absolus en secondes depuis 1970 n'ont pas ce problème.
n13
32
@ n13 Bon point, mais pas vraiment un problème dans Rails, car il se convertit en UTC avant d'insérer des heures dans la base de données.
vonconrad
13
C'est l'un des articles les plus utiles de l'univers Rails. Cela devrait être ajouté au guide des rails ...
Andrew
4
La TIMEcolonne de MySQL n'est pas strictement un "moment de la journée", car elle accepte des heures> 24; il est également utilisable comme "temps écoulé".
nickgrim
6
Est-ce la même chose dans les autres dbs? par exemple postgres?
Andy Hayden
24
  1. : datetime (8 octets)

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

    • Enregistre le nombre de secondes depuis le 1970-01-01
    • Utile pour les colonnes comme updated_at, created_at
  3. : date (3 octets)
    • Date des magasins
  4. : temps (3 octets)
    • Stocke le temps
mingca
la source
3
Cela ressemble plus à la version TL: DR de la réponse acceptée ci
Chidozie Nnachor
0

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

TIMESTAMP utilisé pour suivre les modifications des enregistrements et mettre à jour chaque fois que l'enregistrement est modifié. DATETIME utilisé pour stocker une valeur spécifique et statique qui n'est affectée par aucun changement dans les enregistrements.

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

TIMESTAMP a converti en interne un fuseau horaire actuel en UTC pour le stockage, et pendant la récupération, convertissez le dos au fuseau horaire actuel. DATETIME ne peut pas faire cela.

TIMESTAMP est de 4 octets et DATETIME est de 8 octets.

Plage prise en charge par TIMESTAMP: '1970-01-01 00:00:01 ′ UTC à' 2038-01-19 03:14:07 'UTC DATETIME plage prise en charge:' 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%20is%20constant .

Aussi...

table avec différents types de colonne "date" et types de migration de rails correspondants en fonction de la base de données

Stanislav Modrák
la source