La diferencia entre los diferentes formatos de fecha/hora en ActiveRecord tiene poco que ver con rieles y todo que ver con cualquier base de datos que está utilizando.
Usando MySQL como un ejemplo (si no por otra razón, porque es más popular), que tiene DATE
, DATETIME
, TIME
TIMESTAMP
y tipos de datos de columna; del mismo modo que tiene CHAR
, VARCHAR
, FLOAT
y INTEGER
.
Entonces, usted pregunta, ¿cuál es la diferencia? Bueno, algunos de ellos son autoexplicativos. DATE
solo almacena una fecha, TIME
solo almacena una hora del día, mientras que DATETIME
almacena ambos.
La diferencia entre DATETIME
y TIMESTAMP
es un poco más sutil: DATETIME
tiene el formato de YYYY-MM-DD HH:MM:SS
. Los rangos válidos van desde el año 1000 hasta el año 9999 (y todo lo demás. Mientras que TIMESTAMP
parece similar cuando lo recuperas de la base de datos, es realmente solo un frente para un unix timestamp. Su rango válido va de 1970 a 2038. La diferencia aquí, aparte de las diversas funciones incorporadas dentro del motor de base de datos, es el espacio de almacenamiento. Como DATETIME
almacena cada dígito en el año, mes, día, hora, minuto y segundo, utiliza un total de 8 bytes. Como TIMESTAMP
sólo almacena el número de segundos desde el 1970-01-01, utiliza 4 bytes.
puede leer más acerca de las diferencias entre los formatos de hora en MySQL here.
Al final, se trata de lo que necesita su columna de fecha/hora para hacer. ¿Necesita almacenar fechas y horas antes de 1970 o después de 2038? Use DATETIME
. ¿Necesita preocuparse por el tamaño de la base de datos y se encuentra dentro de ese intervalo de tiempo? Use TIMESTAMP
. ¿Solo necesitas almacenar una fecha? Use DATE
. ¿Solo necesitas almacenar un tiempo? Use TIME
.
Habiendo dicho todo esto, Rails realmente toma algunas de estas decisiones para usted. Tanto :timestamp
como :datetime
tendrán como valor predeterminado DATETIME
, mientras que :date
y :time
corresponden a DATE
y TIME
, respectivamente.
Esto significa que dentro de Rails, solo tiene que decidir si necesita almacenar la fecha, la hora o ambos.
Para el registro, prefiero las marcas de tiempo absolutas (unix) porque el formato YYYY-MM-DD depende de la zona horaria utilizada. Entonces, el cliente necesita saber el huso horario del servidor y necesita hacer conversiones. Los timestamps absolutos de Segundos desde 1970 no tienen ese problema. – n13
@ n13 Buen punto, pero realmente no es un problema en Rails, ya que se convierte a UTC antes de insertar datetimes en la base de datos. – vonconrad
Esta es una de las publicaciones más útiles en el universo de Rails. Esto se debe agregar a la guía de rieles ... – Andrew