type invalid insertar formato for fecha current_timestamp actual mysql datetime

invalid - mysql date default value



¿Cómo establece un valor predeterminado para una columna de MySQL Datetime? (24)

¿Cómo establece un valor predeterminado para una columna de MySQL Datetime?

En SQL Server es getdate() . ¿Cuál es el equivalente para MySQL? Estoy usando MySQL 5.x si eso es un factor.


Al definir los activadores de varias líneas, uno tiene que cambiar el delimitador, ya que el compilador de MySQL tomará el punto y coma como final del activador y generará un error. p.ej

DELIMITER // CREATE TRIGGER `MyTable_UPDATE` BEFORE UPDATE ON `MyTable` FOR EACH ROW BEGIN -- Set the udpate date Set new.UpdateDate = now(); END// DELIMITER ;


Aquí está cómo hacerlo en MySQL 5.1:

ALTER TABLE `table_name` CHANGE `column_name` `column_name` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;

No tengo idea de por qué tiene que ingresar el nombre de la columna dos veces.


Creo que es simple en mysql, ya que mysql, la función incorporada llamada now (), que da la hora actual (hora de esa inserción).

Por lo que su consulta debe ser similar

CREATE TABLE defaultforTime( `creation_time` DATETIME DEFAULT CURRENT_TIMESTAMP, `modification_time` DATETIME default now() );

Gracias.


En la versión 5.6.5, es posible establecer un valor predeterminado en una columna de fecha y hora, e incluso hacer una columna que se actualizará cuando se actualice la fila. La definición de tipo:

CREATE TABLE foo ( `creation_time` DATETIME DEFAULT CURRENT_TIMESTAMP, `modification_time` DATETIME ON UPDATE CURRENT_TIMESTAMP )

Referencia: http://optimize-this.blogspot.com/2012/04/datetime-default-now-finally-available.html



Este es mi ejemplo de gatillo:

/************ ROLE ************/ drop table if exists `role`; create table `role` ( `id_role` bigint(20) unsigned not null auto_increment, `date_created` datetime, `date_deleted` datetime, `name` varchar(35) not null, `description` text, primary key (`id_role`) ) comment=''''; drop trigger if exists `role_date_created`; create trigger `role_date_created` before insert on `role` for each row set new.`date_created` = now();


Estoy ejecutando MySql Server 5.7.11 y esta frase:

ALTER TABLE table_name CHANGE date_column datetime NOT NULL DEFAULT ''0000-00-00 00:00:00''

no esta funcionando Pero lo siguiente:

ALTER TABLE table_name CHANGE date_column datetime NOT NULL DEFAULT ''1000-01-01 00:00:00''

solo funciona

Como una nota al margen , se menciona en los documentos de mysql :

El tipo DATE se utiliza para valores con una parte de fecha pero sin parte de hora. MySQL recupera y muestra los valores de FECHA en formato ''YYYY-MM-DD''. El rango admitido es ''1000-01-01'' a ''9999-12-31''.

aunque también digan:

Los valores de DATE, DATETIME o TIMESTAMP no válidos se convierten al valor "cero" del tipo apropiado (''0000-00-00'' o ''0000-00-00 00:00:00'').


MySQL ( antes de la versión 5.6.5 ) no permite el uso de funciones para los valores predeterminados de DateTime. TIMESTAMP no es adecuado debido a su comportamiento extraño y no se recomienda su uso como datos de entrada. (Ver los valores por defecto del tipo de datos MySQL ).

Dicho esto, puedes lograr esto creando un Disparador .

Tengo una tabla con un campo DateCreated de tipo DateTime. SET NEW.DateCreated=NOW() un activador en esa tabla "Antes de insertar" y " SET NEW.DateCreated=NOW() " y funciona muy bien.

Espero que esto ayude a alguien.


Para mí, el enfoque desencadenante ha funcionado mejor, pero encontré un problema con el enfoque. Considere el disparador básico para establecer un campo de fecha a la hora actual en la inserción:

CREATE TRIGGER myTable_OnInsert BEFORE INSERT ON `tblMyTable` FOR EACH ROW SET NEW.dateAdded = NOW();

Esto suele ser bueno, pero supongamos que desea establecer el campo manualmente a través de la declaración INSERT, así:

INSERT INTO tblMyTable(name, dateAdded) VALUES(''Alice'', ''2010-01-03 04:30:43'');

Lo que sucede es que el desencadenante sobrescribe inmediatamente el valor proporcionado para el campo, por lo que la única forma de establecer una hora no actual es mediante una declaración de ACTUALIZACIÓN de seguimiento: ¡puaj! Para anular este comportamiento cuando se proporciona un valor, intente este activador ligeramente modificado con el operador IFNULL:

CREATE TRIGGER myTable_OnInsert BEFORE INSERT ON `tblMyTable` FOR EACH ROW SET NEW.dateAdded = IFNULL(NEW.dateAdded, NOW());

Esto proporciona lo mejor de ambos mundos: puede proporcionar un valor para su columna de fecha y tomará, y de lo contrario se establecerá de forma predeterminada a la hora actual. Todavía es un ghetto en relación con algo limpio como DEFAULT GETDATE () en la definición de la tabla, ¡pero nos estamos acercando!


Para todos aquellos que se desanimaron al intentar establecer un valor DATETIME predeterminado en MySQL , sé exactamente cómo se siente / siente. Así que aquí está:

ALTER TABLE `table_name` CHANGE `column_name` DATETIME NOT NULL DEFAULT 0

Observe cuidadosamente que no he agregado comillas simples / dobles alrededor del 0

Estoy literalmente saltando después de resolver este: D


Para todos los que usan la columna TIMESTAMP como una solución, deseo secundar la siguiente limitación del manual:

dev.mysql.com/doc/refman/5.0/en/datetime.html

"El tipo de datos TIMESTAMP tiene un rango de ''1970-01-01 00:00:01'' UTC a '' 2038-01-19 03:14:07 '' UTC. Tiene propiedades variables, según la versión de MySQL y el SQL modo en el que se ejecuta el servidor. Estas propiedades se describen más adelante en esta sección ".

Así que obviamente esto romperá su software en aproximadamente 28 años.

Creo que la única solución en el lado de la base de datos es usar desencadenantes como se menciona en otras respuestas.


Por ejemplo, si tuviera una tabla llamada "sitio" con created_at y update_at que fueran DATETIME y necesiten el valor predeterminado de ahora, podría ejecutar el siguiente sql para lograr esto.

ALTER TABLE `site` CHANGE `created_at` `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP; ALTER TABLE `site` CHANGE `created_at` `created_at` DATETIME NULL DEFAULT NULL; ALTER TABLE `site` CHANGE `updated_at` `updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP; ALTER TABLE `site` CHANGE `updated_at` `updated_at` DATETIME NULL DEFAULT NULL;

La secuencia de sentencias es importante porque una tabla no puede tener dos columnas de tipo TIMESTAMP con valores predeterminados de CUREENT TIMESTAMP


Pude resolver esto utilizando esta declaración alternativa en mi tabla que tenía dos campos de fecha y hora.

ALTER TABLE `test_table` CHANGE COLUMN `created_dt` `created_dt` TIMESTAMP NOT NULL DEFAULT ''0000-00-00 00:00:00'', CHANGE COLUMN `updated_dt` `updated_dt` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;

Esto funciona como se espera que funcione la función now (). Insertar nulos o ignorar los campos created_dt y updated_dt da como resultado un valor de marca de tiempo perfecto en ambos campos. Cualquier actualización de la fila cambia el updated_dt. Si inserta registros a través del buscador de consultas MySQL, necesita un paso más, un desencadenante para manejar el created_dt con una nueva marca de tiempo.

CREATE TRIGGER trig_test_table_insert BEFORE INSERT ON `test_table` FOR EACH ROW SET NEW.created_dt = NOW();

El desencadenante puede ser lo que quieras. Simplemente me gusta la convención de nombres [trig] _ [my_table_name] _ [insert]


Puede resolver la marca de tiempo predeterminada. Primero, considere qué conjunto de caracteres está utilizando, por ejemplo, si usó utf8, este conjunto de caracteres es compatible con todos los idiomas y si usó laten1, este conjunto de caracteres solo es compatible con el inglés. Próximo setp. Si está trabajando en cualquier proyecto, debe conocer la zona horaria del cliente y seleccionar su zona cliente. Este paso es obligatorio.


Puede usar now () para establecer el valor de una columna de fecha y hora, pero tenga en cuenta que no puede usar eso como un valor predeterminado.


Puedes usar disparadores para hacer este tipo de cosas.

CREATE TABLE `MyTable` ( `MyTable_ID` int UNSIGNED NOT NULL AUTO_INCREMENT , `MyData` varchar(10) NOT NULL , `CreationDate` datetime NULL , `UpdateDate` datetime NULL , PRIMARY KEY (`MyTable_ID`) ) ; CREATE TRIGGER `MyTable_INSERT` BEFORE INSERT ON `MyTable` FOR EACH ROW BEGIN -- Set the creation date SET new.CreationDate = now(); -- Set the udpate date Set new.UpdateDate = now(); END; CREATE TRIGGER `MyTable_UPDATE` BEFORE UPDATE ON `MyTable` FOR EACH ROW BEGIN -- Set the udpate date Set new.UpdateDate = now(); END;


Si bien no puede hacer esto con DATETIME en la definición predeterminada, simplemente puede incorporar una declaración de selección en su declaración de inserción como esta:

INSERT INTO Yourtable (Field1, YourDateField) VALUES(''val1'', (select now()))

Tenga en cuenta la falta de citas alrededor de la mesa.

Para MySQL 5.5


Si está intentando establecer un valor predeterminado como AHORA (), no creo que MySQL lo admita. En MySQL, no puede usar una función o una expresión como el valor predeterminado para cualquier tipo de columna, excepto la columna de tipo de datos TIMESTAMP, para la cual puede especificar el valor predeterminado de CURRENT_TIMESTAMP.


Si está tratando de establecer el valor predeterminado como AHORA (), MySQL admite que debe cambiar el tipo de esa columna TIMESTAMP en lugar de DATETIME. TIMESTAMP tiene la fecha y la hora actual por defecto ... creo que resolverá su problema ...


Si ya ha creado la tabla, puede utilizar

Para cambiar el valor predeterminado a la fecha actual hora

ALTER TABLE <TABLE_NAME> CHANGE COLUMN <COLUMN_NAME> <COLUMN_NAME> DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;

Para cambiar el valor predeterminado a ''2015-05-11 13:01:01''

ALTER TABLE <TABLE_NAME> CHANGE COLUMN <COLUMN_NAME> <COLUMN_NAME> DATETIME NOT NULL DEFAULT ''2015-05-11 13:01:01'';


Usa el siguiente código

DELIMITER $$ CREATE TRIGGER bu_table1_each BEFORE UPDATE ON table1 FOR EACH ROW BEGIN SET new.datefield = NOW(); END $$ DELIMITER ;



EDICIÓN IMPORTANTE: ahora es posible lograr esto con los campos DATETIME desde MySQL 5.6.5 , eche un vistazo a la otra publicación a continuación ...

Las versiones anteriores no pueden hacer eso con DATETIME ...

Pero puedes hacerlo con TIMESTAMP:

mysql> create table test (str varchar(32), ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP); Query OK, 0 rows affected (0.00 sec) mysql> desc test; +-------+-------------+------+-----+-------------------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+-------------------+-------+ | str | varchar(32) | YES | | NULL | | | ts | timestamp | NO | | CURRENT_TIMESTAMP | | +-------+-------------+------+-----+-------------------+-------+ 2 rows in set (0.00 sec) mysql> insert into test (str) values ("demo"); Query OK, 1 row affected (0.00 sec) mysql> select * from test; +------+---------------------+ | str | ts | +------+---------------------+ | demo | 2008-10-03 22:59:52 | +------+---------------------+ 1 row in set (0.00 sec) mysql>

** CAVEAT: si define una columna con CURRENT_TIMESTAMP ON como predeterminado, necesitará SIEMPRE especificar un valor para esta columna o el valor se restablecerá automáticamente a "ahora ()" en la actualización. Esto significa que si no desea que el valor cambie, su declaración UPDATE debe contener "[nombre de columna] = [nombre de columna]" (o algún otro valor) o el valor se convertirá en "ahora ()". Raro, pero cierto. Espero que esto ayude. Estoy usando 5.5.56-MariaDB **


CREATE TABLE `testtable` ( `id` INT(10) NULL DEFAULT NULL, `colname` DATETIME NULL DEFAULT ''1999-12-12 12:12:12'' )

En la consulta anterior para crear ''tabla de prueba'', usé ''1999-12-12 12:12:12'' como valor predeterminado para la columna DATETIME colname