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, TIMEe TIMESTAMPtipos de dados de coluna; assim como você tem CHAR, VARCHAR, FLOATe INTEGER.
Então, você pergunta, qual é a diferença? Bem, alguns deles são auto-explicativos. DATEarmazena apenas uma data, TIMEapenas armazena uma hora do dia, enquanto DATETIMEarmazena as duas.
A diferença entre DATETIMEe TIMESTAMPé um pouco mais sutil: DATETIMEestá 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 DATETIMElojas todos os dígitos no ano, mês dia, hora, minuto e segundo, ele usa-se um total de 8 bytes. Como TIMESTAMParmazena 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 :timestampe :datetimepadronizarão para DATETIME, enquanto :datee :timecorresponde a DATEe TIME, respectivamente.
Isso significa que, no Rails, você só precisa decidir se precisa armazenar data, hora ou ambas.