A diferença entre os diferentes formatos de data / hora no ActiveRecord tem pouco a ver com o Rails e tudo a ver com o banco de dados que você estiver usando.
Usando o MySQL como um exemplo (se não por outra razão porque é mais popular), você tem DATE
, DATETIME
, TIME
e TIMESTAMP
tipos de dados de coluna; assim como você tem CHAR
, VARCHAR
, FLOAT
e INTEGER
.
Então, você pergunta, qual é a diferença? Bem, alguns deles são auto-explicativos. DATE
armazena apenas uma data, TIME
apenas armazena uma hora do dia, enquanto DATETIME
armazena as duas.
A diferença entre DATETIME
e TIMESTAMP
é um pouco mais sutil: DATETIME
está formatado como YYYY-MM-DD HH:MM:SS
. Os intervalos válidos vão do ano 1000 ao ano 9999 (e tudo mais. Embora TIMESTAMP
pareça semelhante quando você o busca no banco de dados, é realmente apenas uma fachada para um registro de data e hora unix . Seu intervalo válido varia de 1970 a 2038. A diferença aqui, além de vários built-in funções dentro do motor de banco de dados, é espaço de armazenamento. Porque DATETIME
lojas todos os dígitos no ano, mês dia, hora, minuto e segundo, ele usa-se um total de 8 bytes. Como TIMESTAMP
armazena apenas o número de segundos desde 01-01-2009, ele usa 4 bytes.
Você pode ler mais sobre as diferenças entre os formatos de hora no MySQL aqui .
No final, tudo se resume ao que você precisa que sua coluna de data / hora faça. Você precisa armazenar datas e horários antes de 1970 ou após 2038? Use DATETIME
. Você precisa se preocupar com o tamanho do banco de dados e está dentro desse intervalo de tempo? Use TIMESTAMP
. Você só precisa armazenar uma data? Use DATE
. Você só precisa armazenar um tempo? Use TIME
.
Tendo dito tudo isso, o Rails realmente toma algumas dessas decisões para você . Ambos :timestamp
e :datetime
padronizarão para DATETIME
, enquanto :date
e :time
corresponde a DATE
e TIME
, respectivamente.
Isso significa que, no Rails, você só precisa decidir se precisa armazenar data, hora ou ambas.
TIME
coluna do MySQL não é estritamente uma "hora do dia", pois aceita horas> 24; também é utilizável como "tempo decorrido".: datetime (8 bytes)
: registro de data e hora (4 bytes)
fonte
Aqui está uma explicação impressionante e precisa que eu encontrei.
fonte: https://www.dbrnd.com/2015/09/difference-between-datetime-and-timestamp-in-mysql/#:~:text=DATETIME%20vs%20TIMESTAMP%3A,DATETIME%20is%20constant .
Além disso...
tabela com tipos diferentes de "data" da coluna e tipos de migração de trilhos correspondentes, dependendo do banco de dados
fonte