【发布时间】:2016-04-22 06:41:21
【问题描述】:
此 SQL 在 MySQL 5.5 中返回 DATE,但在 MySQL 5.6 中返回 NULL。为什么?
select date(STR_TO_DATE('2015-01', '%Y-%m')) + INTERVAL 1 DAY;
这是 MySQL 5.5 和 5.6 的 SQL Fiddle。 STR_TO_DATE 在这两种情况下都返回一个日期。使用DATE 转换结果有效。尝试添加INTERVAL 时出现问题。我在STR_TO_DATE(...) 或DATE(STR_TO_DATE(...)) 上加一个INTERVAL 都没有关系,结果是一样的。但是,删除 STR_TO_DATE 即可。
select
STR_TO_DATE('2015-01', '%Y-%m') as same_a1,
STR_TO_DATE('2015-01-01', '%Y-%m') as same_a2,
STR_TO_DATE('2015-01', '%Y-%m-%d') as same_a3,
STR_TO_DATE('2015-01-01', '%Y-%m-%d') as same_a4,
date(STR_TO_DATE('2015-01', '%Y-%m')) as same_b1,
date(STR_TO_DATE('2015-01-01', '%Y-%m')) as same_b2,
date(STR_TO_DATE('2015-01', '%Y-%m-%d')) as same_b3,
date(STR_TO_DATE('2015-01-01', '%Y-%m-%d')) as same_b4,
STR_TO_DATE('2015-01', '%Y-%m') + INTERVAL 1 DAY as same_c1,
STR_TO_DATE('2015-01-01', '%Y-%m') + INTERVAL 1 DAY as same_c2,
STR_TO_DATE('2015-01', '%Y-%m-%d') + INTERVAL 1 DAY as same_c3,
STR_TO_DATE('2015-01-01', '%Y-%m-%d') + INTERVAL 1 DAY as same_c4,
date(STR_TO_DATE('2015-01', '%Y-%m')) + INTERVAL 1 DAY as different_d1,
date(STR_TO_DATE('2015-01-01', '%Y-%m')) + INTERVAL 1 DAY as different_d2,
date(STR_TO_DATE('2015-01', '%Y-%m-%d')) + INTERVAL 1 DAY as different_d3,
date(STR_TO_DATE('2015-01-01', '%Y-%m-%d')) + INTERVAL 1 DAY as same_d4,
date('2015-01') + INTERVAL 1 DAY as same_e1,
date('2015-01-01') + INTERVAL 1 DAY as same_e2
;
我搜索了发行说明,但找不到任何东西。到底是怎么回事?这是已知的变化吗?一个错误?
【问题讨论】:
-
对于它的价值,我发现 5.1.73 和 MariaDB 10.0.21 之间存在相同的差异。
-
使用 MySQL CLI 客户端而不是 SQLFiddle,我看到
STR_TO_DATE()在没有给出日期值时会产生奇怪的结果:SELECT STR_TO_DATE('2015-03')会产生2015-03-00。我无法添加日期。它在旧版本和新版本中都产生“第 00 天”的事实一开始似乎是错误的,但是考虑到奇怪的行为,如果在以后的版本中没有收到 NULL,就无法在该无效日期上添加间隔这一事实似乎是正确的。旧版本允许我将 1 天添加到“第 00 天”,如SELECT DATE(STR_TO_DATE('2015-03', '%Y-%m')) + INTERVAL 1 DAY;导致2015-03-01 -
^^... 这不是我所期望的结果。我希望它从
2015-03-01开始并添加 1 天导致2015-03-02。 -
我发现一些博客文章提到了支持的 00 天或 00 月值,但除了众所周知的零日期
0000-00-00 00:00:00之外没有官方文档。 -
@MichaelBerkowski: "
NO_ZERO_IN_DATE模式影响服务器是否允许年部分为非零但月或日部分为 0 的日期。"
标签: mysql sql str-to-date