我正在运行一个简单的过程,它使用以下格式从VARCHAR
列中读取数据并将数据插入到列中:TIME
STR_TO_DATE(vTestTime, '%H:%i').
我收到错误
SQL 错误 (1411):日期时间值不正确:函数 str_to_date 的“09:22”
SELECT STR_TO_DATE("09:22", "%H:%i")
当我从 HeidiSQL 客户端运行它时,我发现类似的语句给了我一个 NULL。
我确定这种语法曾经有效,并且我不知道更改了任何设置,您能建议我做错了什么吗?
编辑:刚刚记得我最近做了一个更改,我在同一台服务器上安装了一个 Wordpress 数据库,这可能会产生一些影响吗?
这是在服务器上运行的内容:
mysql> select str_to_date("09:22", "%H:%i");
+-------------------------------+
| str_to_date("09:22", "%H:%i") |
+-------------------------------+
| NULL |
+-------------------------------+
1 row in set, 1 warning (0.00 sec)
Warning (Code 1411): Incorrect datetime value: '09:22' for function str_to_date
这看起来像一个错误(虽然它在技术上不是一个错误,请参阅我在答案末尾的第一次编辑):
我看到 MySQL 5.7.20 和 5.7.21 上的行为(如果重要的话,在 Centos 7.4 上):
警告是代码 1411
Incorrect datetime value: '09:22' for function str_to_date
。ANSI_QUOTES 未启用,如果我使用单引号,我会收到相同的警告。
根据我阅读文档的理解,查询应该有效:
这个包含日期和时间部分的查询确实有效:
在 MariaDB 10.2.14 上运行原始查询可以正常工作:
编辑: 这是以前报告的错误,请参见此处: https ://bugs.mysql.com/bug.php?id=80064
这些模式在 MySQL 5.7 中默认启用(但在 MariaDB 10.2 中不启用)。因此,在从 sql_mode 系统变量中删除这些之后,我们得到了想要的结果:
编辑 2: 我们不想意外地从
sql_mode
系统变量中删除有用/重要的模式,所以理想情况下我们应该只删除特定的模式,在这种情况下为 NO_ZERO_DATE 和 NO_ZERO_IN_DATE。这可以通过以下方式完成:(
SET GLOBAL sql_mode...
如果您想为全局范围更改它而不仅仅是会话,请使用它。)如果您想
sql_mode
在 MySQL 配置文件中进行设置,那么我认为您只需要“硬编码”它,即只需找出您正在使用的版本的默认模式是什么,删除不需要的模式,然后例如,将生成的字符串添加到[mysqld]
.cnf 文件的部分:这对于 MySQL 5.7 应该是正确的。升级到下一个版本时,您必须再次更新设置。
请注意,存储过程使用自己的
sql_mode
s 运行:来源:MySQL 存储过程文档。
您还可以
sql_mode
在存储过程中更改。我建议不要更新 sql_mode 只需在时间前面添加今天的日期,然后它就会起作用。
问题:
解决方案:
我的桌子是这样的。
实施解决方案后,您将得到这样的结果。
欲了解更多信息,您可以联系我。