以下查询有效

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

我应该注意到有一个警告,但它不会阻止查询执行并返回空结果
show warnings

产量
mysql - 由于函数str_to_date的日期时间值“…”不正确,因此无法创建mysql表-LMLPHP
但是当我试图从结果创建一个表时,问题就出现了。
这行得通
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

这是一个非常简单的玩具示例,但我正试图创建一个更大的表,其中包含许多正确解析的日期值,并且具有相同的效果。
我做错什么了?

最佳答案

你看到的行为对我意味着你在严格的SQL_MODE中运行(这在一般情况下是个好主意)。
您可以通过为会话设置一个不太严格的SQL_MODE来完成您想要的任务。
下面是一个例子,显示了在MySQL 5.7中CREATE TABLE语句在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)

10-05 22:54
查看更多