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()
不会独立于 str
和format
。
我正在使用 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 中的日期时间值不正确
在 STR_TO_DATE 中运行 MySQL REGEXP_SUBSTR 以从文本中提取日期时遇到问题