En Ruby on Rails, ¿cuál es la diferencia entre DateTime, Timestamp, Time y Date?

414

En mi experiencia, obtener las fechas y horas correctas cuando la programación siempre está llena de peligros y dificultades.

Ruby y Rails siempre me han eludido en este caso, aunque solo sea por la abrumadora cantidad de opciones; Nunca tengo idea de cuál elegir.

Cuando uso Rails y miro los tipos de datos ActiveRecord, puedo encontrar lo siguiente

: datetime,: timestamp,: time y: date

y no tengo idea de cuáles son las diferencias o dónde acechan las gotchas.

¿Cual es la diferencia? ¿Para qué los utiliza?

(PD: estoy usando Rails3)

Nick May
fuente

Respuestas:

572

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.

vonconrad
fuente
77
Para el registro, prefiero marcas de tiempo absolutas (unix) porque el formato AAAA-MM-DD depende de la zona horaria utilizada. Por lo tanto, el cliente necesita conocer la zona horaria del servidor y debe realizar conversiones. Segundos desde 1970, las marcas de tiempo absolutas no tienen ese problema.
n13
32
@ n13 Buen punto, pero en realidad no es un problema en Rails, ya que se convierte a UTC antes de insertar fechas y horas en la base de datos.
vonconrad
13
Esta es una de las publicaciones más útiles en el universo de Rails. Esto debería agregarse a la guía de rieles ...
Andrew
44
La TIMEcolumna de MySQL no es estrictamente una "hora del día", ya que acepta horas> 24; también se puede usar como "tiempo transcurrido".
nickgrim
66
¿Es esto lo mismo en otros dbs? por ejemplo, postgres?
Andy Hayden
24
  1. : fecha y hora (8 bytes)

    • Almacena fecha y hora formateadas AAAA-MM-DD HH: MM: SS
    • Útil para columnas como birth_date
  2. : marca de tiempo (4 bytes)

    • Almacena el número de segundos desde 1970-01-01
    • Útil para columnas como updated_at, created_at
  3. : fecha (3 bytes)
    • Fecha de tiendas
  4. : tiempo (3 bytes)
    • Tiempo de tiendas
mingca
fuente
3
Esto se parece más a la versión TL: DR de la respuesta aceptada anterior
Chidozie Nnachor
0

Aquí hay una explicación asombrosa y precisa que encontré.

TIMESTAMP se utiliza para rastrear los cambios de registros y actualizar cada vez que se cambia el registro. DATETIME se utiliza para almacenar valores específicos y estáticos que no se ven afectados por ningún cambio en los registros.

TIMESTAMP también se ve afectado por diferentes ajustes relacionados con la ZONA HORARIA. DATETIME es constante.

TIMESTAMP convirtió internamente una zona horaria actual a UTC para el almacenamiento, y durante la recuperación, convierta la parte posterior a la zona horaria actual. DATETIME no puede hacer esto.

TIMESTAMP tiene 4 bytes y DATETIME tiene 8 bytes.

Rango admitido TIMESTAMP: '1970-01-01 00:00:01' UTC a '2038-01-19 03:14:07' UTC DATETIME rango admitido: '1000-01-01 00:00:00' a '9999 -12-31 23:59:59 ′

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

Stanislav Modrák
fuente