【问题标题】:STR_TO_DATE() returns wrong data from right formatSTR_TO_DATE() 从正确的格式返回错误的数据
【发布时间】: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版本已更改。

标签: mysql sql string date formatting


【解决方案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。
猜你喜欢
  • 1970-01-01
  • 2021-10-29
  • 2023-03-12
  • 2021-12-14
  • 2020-09-30
  • 2016-12-22
  • 2013-11-16
  • 2016-02-04
  • 1970-01-01
相关资源
最近更新 更多