Невозможно создать таблицу mysql из-за неверного значения даты и времени "..." для функции str_to_date

Следующий запрос работает

select date(str_to_date("08-Nov-2005 22:07","%d-%M-%Y %H:%i:%S"))

Как и ожидалось, возвращается

2005-11-08

Следующий запрос также работает

select date(str_to_date("XXXX","%d-%M-%Y %H:%i:%S"))

Как и ожидалось, возвращается

NULL

Я должен отметить, что есть предупреждение, но оно не останавливает выполнение запроса и возврат результата NULL

show warnings

доходность

введите описание изображения здесь

Но проблема возникает, когда я пытаюсь создать таблицу из результата.

Это работает

CREATE TABLE myTable AS select date(str_to_date("08-Nov-2005 22:07","%d-%M-%Y %H:%i:%S"))

Но это не

CREATE TABLE myTable AS select date(str_to_date("XXXX","%d-%M-%Y %H:%i:%S"))

Сообщение об ошибке

Incorrect datetime value: 'XXXX' for function str_to_date

Это очень простой игрушечный пример, но я пытаюсь создать гораздо большую таблицу с правильно проанализированным множеством значений даты, и она имеет тот же эффект.

Что я делаю неправильно?

2 ответа

Решение

Поведение, которое вы видите, подразумевает, что вы работаете в строгом SQL_MODE (что является хорошей идеей в общем, кстати).

Вы можете достичь желаемого, установив менее строгий SQL_MODE для вашей сессии.

Вот пример, показывающий ваши CREATE TABLE заявление, терпящее неудачу в MySQL 5.7 с STRICT_ALL_TABLES режим, но успешно, как только я снимаю это ограничение:

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

mysql> CREATE TABLE myTable AS select date(str_to_date("XXXX","%d-%M-%Y %H:%i:%S"));
ERROR 1411 (HY000): Incorrect datetime value: 'XXXX' for function str_to_date

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

mysql> CREATE TABLE myTable AS select date(str_to_date("XXXX","%d-%M-%Y %H:%i:%S"));
Query OK, 1 row affected, 1 warning (0.02 sec)
Records: 1  Duplicates: 0  Warnings: 1

mysql> select * from myTable;
+-----------------------------------------------+
| date(str_to_date("XXXX","%d-%M-%Y %H:%i:%S")) |
+-----------------------------------------------+
| NULL                                          |
+-----------------------------------------------+
1 row in set (0.01 sec)

Хорошо попробовал оба запроса, которые вы заявили выше, и, кажется, работает нормально для меня. Единственное, что значение, вставленное во второй запрос, равно NULL, что вы и ожидали.

Другие вопросы по тегам