35

Debo guardar fechas y horas en diferentes tablas de una aplicación típica transaccional dónde voy a almacenar información variada, cómo por ejemplo:

  • Fechas y horas a las que ocurre cada transacción (Factura, Recibo de Pago, etc.)
  • Fechas y horas de eventos futuros, como citas y entregas programadas
  • Fechas pasadas, como la fecha de nacimiento del empleado, o de los hijos del empleado.

Tengo poca experiencia con MySQL y no estoy seguro de qué tipo de dato debo elegir en cada caso.

Qué es lo recomendable, utilizar un campo de tipo DateTime o de tipo TimeStamp y ¿por qué?

jachguate
  • 25,659
  • 7
  • 35
  • 61
  • 1
    Pues esta pregunta es muy abierta, puedes explicar un poco mejor? Que es lo que estás tratando de hacer? – Carlos Muñoz Nov 02 '15 at 15:39
  • 1
    Guardar una fecha y hora en mySQL – jachguate Nov 02 '15 at 15:42
  • 1
    @jachguate amigo, tu pregunta es buena, sólo falta que añades más información sobre el caso de uso que le quieres dar o el objetivo que tienes para que se te brinde una repuesta (recomendada) a tu caso práctico. Mientras más contenido aportes, será para mejora de todos nosotros. – Chofoteddy Dec 06 '15 at 10:44
  • 1
    @Chofoteddy la naturaleza de la pregunta es amplia, pues lo que se busca es comprender la diferencia entre ambos tipos de dato o, dicho de otra manera, comprender de manera general para qué casos puede convenir utilizar uno sobre el otro. He añadido información adicional que espero sea suficiente para que la pregunta sea re-abierta. – jachguate Dec 06 '15 at 16:35

3 Answers3

38

En algún punto de esta documentación de MySQL expone algo así: http://dev.mysql.com/doc/refman/5.7/en/datetime.html (link inglés)

TIMESTAMP tiene un rango de '1970-01-01 00:00:01' GMT a '01/09/2038 03:14:07' GMT.

DATETIME se usa cuando se necesita valores que contienen tanto la fecha y la hora. MySQL recupera y muestra los valores DATETIME en 'AAAA-MM-DD HH: MM: SS' formato. El rango admitido es '01/01/1000 00:00:00' a '9999-12-31 23:59:59'.

Partiendo de lo anterior y teniéndolo en cuenta es el posible que el rango de los datos que podría almacenar o estar interesado en ello le inclinen a favor de uno u otro, por ejemplo si usted trabaja con hipotecas por decir algo es fácil que usted supere el rango de TIMESTAMP a día de hoy.

TIMESTAMP es afectada por las configuraciones/ajustes de la zona horaria. Mientras que DATETIME es constante.

TIMESTAMP es de cuatro bytes y DATETIME de ocho bytes, por consecuencia las marcas de tiempo (TIMESTAMP) son también más ligeras en la base de datos, con indexados más rápidos.

Teniendo en cuenta todo lo anterior si usted desea almacenar un valor específico "podría que fuese mejor" usar DATATIME, pero si lo que desea es almacenar para realizar algún seguimento de posibles cambios en los registro quizás le convenga usar TIMESTAMP cuando cambia un registro.

Si esta trabajando sobre MySQL 5 o superior, los valores de TIMESTAMP se convierten de la zona horaria actual a UTC para el almacenamiento, y se convierten de nuevo de UTC a la zona horaria actual para la recuperación. sólo para el tipo de datos TIMESTAMP.

(NOTA si encuentro el link de lo anterior lo intentaré poner por aquí)

Espero le ayude.

Oundroni
  • 1,277
  • 3
  • 16
  • 30
Angel Angel
  • 9,623
  • 9
  • 37
  • 68
9

¿Debo utilizar un campo de tipo DateTime o TimeStamp en mySQL?

Depende de tus requerimientos, existen ciertas consideraciones para cada caso por ejemplo el rango de valores que puede soportar cada uno.

  • DATETIME considera valores de fecha y hora en formato:'YYYY-MM-DD HH:MM:SS', el rango soportado: '1000-01-01 00:00:00' a '9999-12-31 23:59:59'

  • TIMESTAMP También considera valores fecha y hora pero tiene un rango de '1970-01-01 00:00:01' UTC a '2038-01-19 03:14:07' UTC.

mas información: Tipos DATE, DATETIME, and TIMESTAMP.

otras propiedades tal vez obvias para muchos de nosotros es la inicialización automática y actualización a la fecha y hora actual. Valores TIMESTAMP con default de cero no son permitidos en MySql.

Jorgesys
  • 103,630
  • 13
  • 52
  • 124
0

Yo solo le veo el sentido a usar TimeStamp cuando quieras asegurarte de que dicha fecha se establezca automáticamente cuando se inserte o actualice el registro.

Por ejemplo si quieres guardar la fecha y hora de un evento lo defines así:

CREATE TABLE `eventos` 
(
  `Id` int(11) NOT NULL AUTO_INCREMENT,
  `Evento` VarChar(50) NOT NULL DEFAULT '', 
  `FechaHora` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 
  PRIMARY KEY (`Id`)
);

Fíjate que en el INSERT no incluyes el campo FechaHora.

INSERT INTO eventos(Evento) VALUES('Evento 0001');

SELECT * FROM eventos; 
Id Evento FechaHora
1 Evento 0001 2021-06-17 18_20_06

Otro ejemplo con UPDATE:

CREATE TABLE `productos` 
(
  `Id` int(11) NOT NULL AUTO_INCREMENT,
  `Nombre` VarChar(50) NOT NULL DEFAULT '', 
  `Marca` VarChar(50) NOT NULL DEFAULT '', 
  `Referencia` VarChar(50) NOT NULL DEFAULT '', 
  `FechaModif` TIMESTAMP NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, 
  PRIMARY KEY (`Id`)
);


INSERT INTO productos (Nombre, Marca, Referencia, FechaModif) VALUES ('MOUSE', 'GENIUS', 'X105', NOW());

SELECT * FROM productos; 
Id Nombre Marca Refereencia FechaModif
1 MOSUE GENIUS X105 2021-06-17 19:25:08
UPDATE productos p SET p.Referencia = 'X106' WHERE p.Id = 1;

SELECT * FROM productos; 
Id Nombre Marca Refereencia FechaModif
1 MOSUE GENIUS X106 2021-06-17 19:26:42
Javi fer2
  • 5,210
  • 6
  • 10
  • 24