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
, TIME
y TIMESTAMP
tipos de datos de columna; al igual que usted tiene CHAR
, VARCHAR
, FLOAT
y INTEGER
.
Entonces, preguntas, ¿cuál es la diferencia? Bueno, algunos de ellos se explican por sí mismos. DATE
solo almacena una fecha, TIME
solo almacena una hora del día, mientras que DATETIME
almacena ambas.
La diferencia entre DATETIME
y TIMESTAMP
es un poco más sutil: DATETIME
está 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 DATETIME
almacena cada dígito en el año, mes, día, hora, minuto y segundo, utiliza un total de 8 bytes. Como TIMESTAMP
solo 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 :timestamp
y por :datetime
defecto será DATETIME
, while :date
y :time
corresponde aDATE
y TIME
, respectivamente.
Esto significa que dentro de Rails, solo tiene que decidir si necesita almacenar la fecha, la hora o ambas.
TIME
columna 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