STR_TO_DATE() 从正确的格式返回错误的数据

Posted

技术标签:

【中文标题】STR_TO_DATE() 从正确的格式返回错误的数据【英文标题】:STR_TO_DATE() returns wrong data from right format 【发布时间】:2021-09-27 08:31:25 【问题描述】:

使用 mysql 5.7,它假装从代表四位数年份的字符串转换为两位数月份,中间没有任何其他字符。

例如,运行以下语句

SELECT str_to_date('202105','%Y%m');

返回的内容:160101 是 1601 年 1 月而不是 2021 年 5 月。考虑到原因中的 function,所需的 arguments 似乎是正确的。

【问题讨论】:

在 MySQL 5.6 及更早版本中返回2021-05-00,在更高版本中返回NULL。这个月没有第 0 天,所以这显然是他们修复的错误。 还需要指定日期,否则在 MySQL 8.0+ 中将无法使用。 注意:MySQL版本已更改。 【参考方案1】:

我无法在DBFiddle 上重现您的确切结果,但我确实看到它创建了一个null 而不是预期的日期。您可以做的是附加一个 '01' 以获得更好的日期文字:

SELECT str_to_date(concat('202105', '01'),'%Y%m%d');

看这里:

https://www.db-fiddle.com/f/sbArVsLF6BVDGSrYdy8geP/0

【讨论】:

我这样运行它,我得到16010101 @NelsonA.Morais MySql 的确切版本,以及您如何观察结果...因为再次,您可以尝试并查看我提供的链接。 明白。同时,当它对输出应用UNIX_TIMESTAMP() 函数时,它返回了 1970 年 7 月 5 日。所以,我假设它将 20210501 秒添加到 Unix 纪元,然后 STR_TO_DATE() 不会独立于 strformat 我正在使用 MySQL Workbench 8.0,从我测试过的当前连接检查服务器状态后,我看到的毕竟是 5.7.6 版本。 无论如何,我尝试通过您的链接在两个版本(8.0 和 5.7)中运行它,并且输出正常。但是,问题仍然存在。【参考方案2】:

您还需要指定日期,否则在 MySQL 8.0+ 中将无法使用。

您需要指定日期的所有部分,即必须指定年、月和日,才能使功能正常运行。

# Incorrect Code:
SELECT str_to_date('202105','%Y%m');

# Correct Code:
SELECT str_to_date('20210501','%Y%m%d');

输出

2020-05-01

参考:https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html#function_str-to-date

【讨论】:

我也遇到过这个问题,很遗憾,因为文档明确显示了这个工作“未指定的日期或时间部分的值为 0,因此 str 中未完全指定的值会产生部分或全部部分的结果设置为 0:" 我运行了正确的代码,得到了16010101 MySQL 版本毕竟是5.7。

以上是关于STR_TO_DATE() 从正确的格式返回错误的数据的主要内容,如果未能解决你的问题,请参考以下文章

MariaDB:如何使用STR_TO_DATE考虑本地日期格式?

使用 str_to_date 函数从文件中将数据加载到 MySQL 中的日期时间值不正确

MySQL STR_TO_DATE NULL 错误

在 STR_TO_DATE 中运行 MySQL REGEXP_SUBSTR 以从文本中提取日期时遇到问题

#1411 - INSERT INTO...SELECT 上函数 str_to_date 的日期时间值不正确

我:正在尝试使用 STR_TO_DATE 但为啥返回 null?