MySQL 5.6 DateTime Valor de fecha y hora incorrecto: '2013-08-25T17: 00: 00 + 00: 00' con código de error 1292


15

Estoy usando MySQL 5.6 y tengo un programa que ejecuta la siguiente instrucción SQL en mi base de datos:

UPDATE `m_table` SET `s_time` = '2013-08-25T17:00:00+00:00' WHERE id = '123' 

Desafortunadamente, aparece el siguiente error: Valor de fecha y hora incorrecto: '2013-08-25T17: 00: 00 + 00: 00' para la columna 's_time' en la fila 1

El tipo de datos para s_time es DateTime.

Ya he intentado establecer la propiedad allow_invalid_dates usando el banco de trabajo.

¿Alguien puede entender y explicarme este error? Sé que si cambio manualmente la declaración a UPDATE m_tableSET s_time= '2013-08-25 17:00:00' WHERE id = '123', la declaración funciona.

Desafortunadamente, no puedo modificar el programa que proporciona la declaración SQL (que me dijeron que es válido por el creador del programa) y tampoco puedo entender lo que simboliza el +00: 00.

Gracias

Respuestas:


24
'2013-08-25T17:00:00+00:00'

Este es un valor válido de fecha y hora iso-8601 , pero no es un literal de fecha y hora válido de MySQL . En ese punto, el desarrollador es incorrecto.

La documentación explica qué ALLOW_INVALID_DATEShace:

Compruebe solo que el mes está en el rango de 1 a 12 y el día está en el rango de 1 a 31.

En otras palabras, 2013-02-31sería una fecha permitida si allow_invalid_datesse establece. Esta opción no hace nada cuando la fecha o la fecha y hora ni siquiera están en un formato válido para MySQL.

El +00:00es el desplazamiento de la zona horaria de UTC . En este caso, el tiempo expresado está en UTC, por lo que el desplazamiento es cero horas, cero minutos.

Su solución sería quitar el STRICT_TRANS_TABLESde la sql_modeque es un defecto en el archivo de configuración creado durante el proceso de instalación de MySQL 5.6 ... que debe considerar cuidadosamente las implicaciones de este cambio, pero sí permitir que los datos van en.

mysql> select @@sql_mode;
+--------------------------------------------+
| @@sql_mode                                 |
+--------------------------------------------+
| STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION |
+--------------------------------------------+
1 row in set (0.00 sec)

mysql> insert into datetimetest(dt) values ('2013-08-26T12:00:00+00:00');
ERROR 1292 (22007): Incorrect datetime value: '2013-08-26T12:00:00+00:00' for column 'dt' at row 1

-- remove STRICT_TRANS_TABLES -- note that executing this only removes it for your
-- current session -- it does not make a server-wide config change

mysql> set @@sql_mode='no_engine_substitution';
Query OK, 0 rows affected (0.00 sec)

mysql> select @@sql_mode;
+------------------------+
| @@sql_mode             |
+------------------------+
| NO_ENGINE_SUBSTITUTION |
+------------------------+
1 row in set (0.00 sec)

-- now MySQL will accept the invalid value, with a warning

mysql> insert into datetimetest(dt) values ('2013-08-26T12:00:00+00:00');
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> show warnings;
+---------+------+-----------------------------------------+
| Level   | Code | Message                                 |
+---------+------+-----------------------------------------+
| Warning | 1265 | Data truncated for column 'dt' at row 1 |
+---------+------+-----------------------------------------+
1 row in set (0.00 sec)

-- the value did get inserted, but the time zone information was lost:

mysql> select * from datetimetest;
+----+---------------------+
| id | dt                  |
+----+---------------------+
|  1 | 2013-08-26 12:00:00 |
+----+---------------------+
1 row in set (0.00 sec)

Gracias. Al final, le pedí al programador que cambiara el código PHP que creó la instrucción SQL para cumplir con el estándar MySQL, pero esta es una solución interesante. Lo extraño es que la declaración SQL original funciona en versiones anteriores de MySQL.
Andrew

2
La inclusión STRICT_TRANS_TABLESen un archivo de configuración predeterminado solo se introdujo en MySQL 5.6, lo que explica el cambio de comportamiento ... si habilita esto SQL_MODEen versiones anteriores, la consulta también se rompería en esas versiones.
Michael - sqlbot

Acabas de salvarme la vida. ¡Muchas gracias por la respuesta!
rafaels88
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.