La diferencia entre los diferentes formatos de fecha / hora en ActiveRecord tiene poco que ver con Rails y mucho que ver con cualquier base de datos que esté utilizando.
El uso de MySQL como un ejemplo (si no por otra razón, porque es más popular), tiene DATE, DATETIME, TIMEy TIMESTAMPtipos de datos de columna; al igual que usted tiene CHAR, VARCHAR, FLOATy INTEGER.
Entonces, preguntas, ¿cuál es la diferencia? Bueno, algunos de ellos se explican por sí mismos. DATEsolo almacena una fecha, TIMEsolo almacena una hora del día, mientras que DATETIMEalmacena ambas.
La diferencia entre DATETIMEy TIMESTAMPes un poco más sutil: DATETIMEestá formateada como 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. Si bien se TIMESTAMP ve similar cuando se obtiene de la base de datos, en realidad es solo un frente para una marca de tiempo de Unix . Su rango válido va de 1970 a 2038. La diferencia Aquí, aparte de las diversas funciones integradas dentro del motor de base de datos, se encuentra el espacio de almacenamiento. Debido a que DATETIMEalmacena cada dígito en el año, mes, día, hora, minuto y segundo, utiliza un total de 8 bytes. Como TIMESTAMPsolo almacena el número de segundos desde 1970-01-01, utiliza 4 bytes.
Puede leer más sobre las diferencias entre los formatos de hora en MySQL aquí .
Al final, se reduce a lo que necesita que haga su columna de fecha / hora. ¿Necesita almacenar fechas y horas antes de 1970 o después de 2038? Uso DATETIME. ¿Necesita preocuparse por el tamaño de la base de datos y está dentro de ese rango de tiempo? Uso TIMESTAMP. ¿Solo necesitas guardar una fecha? UtilizarDATE . ¿Solo necesitas almacenar un tiempo? Uso TIME.
Habiendo dicho todo esto, Rails en realidad toma algunas de estas decisiones por ti . Ambos :timestampy por :datetimedefecto será DATETIME, while :datey :timecorresponde aDATE y TIME, respectivamente.
Esto significa que dentro de Rails, solo tiene que decidir si necesita almacenar la fecha, la hora o ambas.
TIMEcolumna de MySQL no es estrictamente una "hora del día", ya que acepta horas> 24; también se puede usar como "tiempo transcurrido".: fecha y hora (8 bytes)
: marca de tiempo (4 bytes)
fuente
Aquí hay una explicación asombrosa y precisa que encontré.
fuente: https://www.dbrnd.com/2015/09/difference-between-datetime-and-timestamp-in-mysql/#:~:text=DATETIME%20vs%20TIMESTAMP%3A,DATETIME%20is%20constant .
También...
tabla con diferentes tipos de "fecha" de columna y tipos de migración de rieles correspondientes según la base de datos
fuente