Cómo insertar automáticamente la fecha y hora en mysql

Para insertar automáticamente la fecha y la hora, es decir, el timestamp, en un campo de tipo TIMESTAMP en una tabla en MySQL podemos utilizar CURRENT_TIMESTAMP, siempre que estemos utilizando una versión de servidor Mysql superior a la 4.1.
Si se utiliza el timestamp automático en las inserciones, cuando se omita el campo en una inserción, éste tomara el valor de fecha y hora que tenga el servidor en ese momento. Para esto se debe usar la propiedad DEFAULT CURRENT_TIMESTAMP en la creación del campo.
Si se utiliza en las actualizaciones, cuando se produzca una sentencia UPDATE que omita el campo que tiene la propiedad en el timestamp, el campo tomará el valor actual de fecha y hora del servidor. Para esto se debe usar la propiedad ON UPDATE CURRENT_TIMESTAMP en la creación del campo.

Se pueden usar por separado, o combinadas:

Tabla con un campo timestamp que toma un valor de fecha automático tanto en inserciones como actualizaciones

mysql> CREATE TABLE tabla_ejemplo1 (
fecha TIMESTAMP DEFAULT CURRENT_TIMESTAMP 
ON UPDATE CURRENT_TIMESTAMP
);
Query OK, 0 rows affected (0.09 sec)

Tabla con un campo timestamp que toma un valor de fecha automático tanto en inserciones pero NO en actualizaciones

mysql> CREATE TABLE tabla_ejemplo2 (
fecha TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Query OK, 0 rows affected (0.03 sec)

Tabla con un campo timestamp que toma un valor de fecha automático en actualizaciones pero NO en inserciones

mysql> CREATE TABLE tabla_ejemplo3 (
fecha TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
Query OK, 0 rows affected (0.02 sec)

Ejemplo de inserción en una tabla con un campo DEFAULT CURRENT_TIMESTAMP

mysql> INSERT INTO tabla_ejemplo2 VALUES();
Query OK, 1 row affected (0.02 sec)
mysql> SELECT * FROM tabla_ejemplo2;
+---------------------+
| fecha               |
+---------------------+
| 2008-05-31 20:06:50 |
+---------------------+
1 row in set (0.00 sec)

Ejemplo de actualización de un campo con la propiedad ON UPDATE CURRENT_TIMESTAMP

mysql> INSERT INTO tabla_ejemplo3 VALUES();
Query OK, 1 row affected (0.03 sec)
mysql> ALTER TABLE tabla_ejemplo3 ADD COLUMN descripcion VARCHAR(20);
Query OK, 1 row affected (0.13 sec)
mysql> UPDATE tabla_ejemplo3 SET descripcion = 'descripcion';
Query OK, 1 row affected (0.02 sec)
mysql> SELECT * FROM tabla_ejemplo3;
+---------------------+-------------+
| fecha               | descripcion |
+---------------------+-------------+
| 2008-05-31 20:00:00 | descripcion |
+---------------------+-------------+
1 row in set (0.00 sec)

Este sistema tiene la limitación de que solamente puede haber un campo DEFAULT CURRENT_TIMESTAMP por cada tabla, si intentamos crear dos, nos devolverá el siguiente error:

mysql> CREATE TABLE tabla_ejemplo4 (
    -> descripcion VARCHAR(30),
    -> fecha_uno TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    -> fecha_dos TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
ERROR 1293 (HY000): Incorrect table definition; there can be only one TIMESTAMP
column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause

Las columnas con la propiedad ON UPDATE CURRENT_TIMESTAMP están sujetas a la misma limitación.

También estamos limitados en el orden en el que creamos las columnas de tipo TIMESTAMP, la única columna que puede utilizar la propiedad CURRENT_TIMESTAMP es la primera en el orden de declaración, a no ser que le indiquemos un valor por defecto a la primera columna TIMESTAMP, ejemplo:

mysql> CREATE TABLE tabla_ejemplo4 (
    -> descripcion VARCHAR(30),
    -> fecha_uno TIMESTAMP,
    -> fecha_dos TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
ERROR 1293 (HY000): Incorrect table definition; there can be only one TIMESTAMP
column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause
mysql> CREATE TABLE tabla_ejemplo4 (
    -> descripcion VARCHAR(30),
    -> fecha_uno TIMESTAMP DEFAULT 0,
    -> fecha_dos TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
Query OK, 0 rows affected (0.03 sec)

Se puede utilizar cualquiera de estas opciones en lugar de CURRENT_TIMESTAMP: CURRENT_TIMESTAMP(), NOW(), LOCALTIME, LOCALTIME(), LOCALTIMESTAMP, o LOCALTIMESTAMP().

mysql> CREATE TABLE tabla_ejemplo5 (
    -> descripcion VARCHAR(30),
    -> fecha_uno TIMESTAMP DEFAULT NOW());
Query OK, 0 rows affected (0.03 sec)
mysql> CREATE TABLE tabla_ejemplo6 (
    -> descripcion VARCHAR(30),
    -> fecha_uno TIMESTAMP DEFAULT LOCALTIME);
Query OK, 0 rows affected (0.03 sec)

Nota: No se puede utilizar DEFAULT CURRENT_TIMESTAMP en la declaración de una columna de la tabla y ON UPDATE CURRENT_TIMESTAMP en otra columna diferente, si lo hacemos, nos devolverá un error de definición de tabla incorrecta.

mysql> CREATE TABLE dif_columnas (
    -> creado TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    -> actualizado TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    -> datos CHAR(20));
ERROR 1293 (HY000): Incorrect table definition; there can be only one TIMESTAMP
column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause

10 comentarios, participa en la conversación

  • Muchas gracias hacía tiempo que andaba buscando esto, sé que era posible pero no daba con el comando exacto ;)
    Gracies!

  • No hay de qué, me alegro que te haya sido de utilidad :)

  • es muy util la informacion, tengo una duda con respecto a eso ya que estoy creando un sistema que manejara la hora y fecha del sistema pero lo hara por medio de procesos por ejemplo cuando se de alta a un folio genera una hora, cuando ese folio pase a otro departamento genera otra hora y fecha pero tienen que estar lamacenados las dos. mi duda es si se puede en una sola talba otengo que crear una para cada proceso.

  • Puedes crear varios campos diferentes dentro de la misma tabla para guardar las distintas horas de creacion y modificacion, lo que no puedes hacer es que mas de uno de estos campos tenga la propiedad de generar autonumericos de forma automática, tendrías que crear uno de los campos como DEFAULT CURRENT_TIMESTAMP y el resto de los campos de fecha insertarlos utilizando NOW o CURRENT_TIMESTAMP como valores de inserción o actualización.

  • GRACIAS, me dieron una mano que hace ratao andaba buscando. Ja ya esta funcionando. GRACIAS NUEVAMENTE

  • Me alegro que el artículo te haya sido de utilidad Fernando!
    Un saludo

  • graaaaaaaaaaaaacias!!!!!!!!!!!!

  • soy vastante nuebo en esto y tengo un problema con las
    fechas (yyyy-m-d) las cuales pueden ser modificadas ya que son pedidos antisipados el problema me surge cuando hago el UPDATE no me la toma como fecha la BD; el dato es de tipo DATE y no e encontrado alguna funcion que convierta CHAR a DATE
    desde ya gracias

  • en este caso, tu mismo debes dar el formato a la fecha que pasarás como una cadena CHAR, si tiene el formato correcto, la BD lo convierte a fecha....

    es mejor usar el formato ansi "9999-88-77", y eso tambien depende del lenguaje con el que estes programando

    si es en PHP, asegurate de que el mes y el dia tengan siempre dos digitos

    si es VB, entonces la conversion de un campo date puede ser automatica si lo asignas al campo en el recordset. Ej: rec("fecha") = date()

  • como se ingreso desde php la mediante un formulario la fecha automaticamente

  • Comentar

    CAPTCHA
    Esta pregunta sirve para distinguir si eres un humano o un spambot.
    6 + 8 =
    Resuelve esta operación e introduce el resultado, por ejemplo, para 1+3, introduce 4
    This blog uses CommentLuv plugin which will try and parse your sites feed and display a link to your last post, please be patient while it tries to find it for you