2010-10-13 25 views
364

Según mi experiencia, obtener fechas/horas correctas cuando la programación siempre está llena de peligros y dificultades.En Ruby on Rails, ¿cuál es la diferencia entre DateTime, Timestamp, Time y Date?

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

cuando estoy usando rieles y mirando a los tipos de datos de ActiveRecord puedo encontrar la siguiente

: fecha y hora,: fecha y hora,: el tiempo, y: Fecha

y no tienen idea de lo que el las diferencias son o donde acechan las trampas.

¿Cuál es la diferencia? ¿Para qué los utiliza?

(P. S. estoy usando Rails3)

Respuesta

508

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, TIMETIMESTAMP 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 TIMESTAMPparece 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.

+6

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

+27

@ 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

+9

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

1
  1. : fecha y hora (8 bytes)

    • Tiendas de fecha y hora con formato AAAA-MM-DD HH: MM: SS
    • Útil para columnas como birth_date
  2. : timestamp (4 bytes)

    • Tiendas numbe r de segundos desde 1970-01-01
    • Útil para columnas como updated_at, created_at
  3. : Fecha (3 bytes)
    • Tiendas Fecha
  4. : Tiempo (3 bytes)
    • Tiendas Tiempo
Cuestiones relacionadas