In Ruby on Rails, qual è la differenza tra DateTime, Timestamp, Time e Date?


414

Nella mia esperienza, ottenere date / orari giusti quando la programmazione è sempre irto di pericoli e difficoltà.

Ruby e Rails mi hanno sempre eluso su questo, se non altro per il numero schiacciante di opzioni; Non ho mai idea di quale scegliere.

Quando utilizzo Rails e osservo i tipi di dati ActiveRecord, trovo quanto segue

: datetime,: timestamp,: time e: date

e non ho idea di quali siano le differenze o di dove si nascondano i gotcha.

Qual è la differenza? Per cosa li usi?

(PS sto usando Rails3)

Risposte:


572

La differenza tra diversi formati di data / ora in ActiveRecord ha poco a che fare con Rails e tutto a che fare con qualunque database tu stia utilizzando.

Utilizzando MySQL come esempio (se non altro perché è più popolare), si dispone DATE, DATETIME, TIMEe TIMESTAMPtipi di dati di colonna; proprio come avete CHAR, VARCHAR, FLOATe INTEGER.

Quindi, chiedi, qual è la differenza? Bene, alcuni di loro sono autoesplicativi. DATEmemorizza solo una data, TIMEmemorizza solo l'ora del giorno, mentre DATETIMEmemorizza entrambi.

La differenza tra DATETIMEe TIMESTAMPè un po 'più sottile: DATETIMEè formattata come YYYY-MM-DD HH:MM:SS. Gli intervalli validi vanno dall'anno 1000 all'anno 9999 (e tutto il resto. Mentre TIMESTAMP sembra simile quando lo recuperi dal database, è davvero solo un fronte per un timestamp unix . Il suo intervallo valido va dal 1970 al 2038. La differenza qui, a parte le varie funzioni integrate nel motore di database, c'è lo spazio di archiviazione. Poiché DATETIMEmemorizza ogni cifra dell'anno, mese giorno, ora, minuto e secondo, utilizza un totale di 8 byte. Poiché TIMESTAMPmemorizza solo il numero di secondi dal 1970-01-01, utilizza 4 byte.

Puoi leggere di più sulle differenze tra i formati di tempo in MySQL qui .

Alla fine, si riduce a ciò di cui hai bisogno per fare la colonna data / ora. Devi memorizzare date e orari prima del 1970 o dopo il 2038? Usa DATETIME. Devi preoccuparti delle dimensioni del database e ti trovi in ​​quel intervallo di tempo? Usa TIMESTAMP. Devi solo memorizzare una data? Usa DATE. Devi solo conservare un orario? Usa TIME.

Detto questo, Rails in realtà prende alcune di queste decisioni per te . Entrambi :timestampe :datetimesaranno impostati su DATETIME, while :datee :timecorrisponde rispettivamente a DATEe TIME, rispettivamente.

Ciò significa che all'interno di Rails devi solo decidere se memorizzare la data, l'ora o entrambi.


7
Per la cronaca, preferisco i timestamp assoluti (unix) perché il formato AAAA-MM-GG dipende dal fuso orario utilizzato. Pertanto, il client deve conoscere il fuso orario del server e deve eseguire le conversioni. I timestamp assoluti dal secondo al 1970 non hanno questo problema.
n13,

32
@ n13 Un buon punto, ma in realtà non è un problema in Rails, poiché si converte in UTC prima di inserire i periodi di tempo nel database.
vonconrad,

13
Questo è uno dei post più utili nell'universo di Rails. Questo dovrebbe essere aggiunto alla guida delle rotaie ...
Andrew,

4
La TIMEcolonna di MySQL non è strettamente un "momento del giorno", poiché accetta ore> 24; è anche utilizzabile come "tempo trascorso".
Nickgrim,

6
È lo stesso in altri dbs? ad esempio Postgres?
Andy Hayden,

24
  1. : datetime (8 byte)

    • Memorizza data e ora formattate AAAA-MM-GG HH: MM: SS
    • Utile per colonne come birth_date
  2. : timestamp (4 byte)

    • Memorizza il numero di secondi dal 1970-01-01
    • Utile per colonne come Updated_at, Created_at
  3. : data (3 byte)
    • Data negozi
  4. : tempo (3 byte)
    • Tempo di negozi

3
È più simile alla versione TL: DR della risposta accettata sopra
Chidozie Nnachor,

0

Ecco una spiegazione fantastica e precisa che ho trovato.

TIMESTAMP utilizzato per tenere traccia delle modifiche ai record e aggiornarsi ogni volta che il record viene modificato. DATETIME utilizzato per archiviare un valore specifico e statico che non è influenzato da alcuna modifica nei record.

TIMESTAMP è influenzato anche dalle diverse impostazioni relative a TIME ZONE. DATETIME è costante.

TIMESTAMP ha convertito internamente un fuso orario corrente in UTC per l'archiviazione e durante il recupero convertire il fuso orario corrente. DATETIME non può farlo.

TIMESTAMP è di 4 byte e DATETIME è di 8 byte.

Intervallo supportato TIMESTAMP: da '1970-01-01 00:00:01 ′ UTC a' 2038-01-19 03:14:07 ′ DATETIME UTC intervallo supportato: da '1000-01-01 00:00:00 ′ a' 9999 -12-31 23:59:59 ′

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

Anche...

tabella con tipi di colonna "data" diversi e tipi di migrazione delle rotaie corrispondenti a seconda del database

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.