2

此 SQLDATE在 MySQL 5.5 但NULL在 MySQL 5.6 中返回 a。为什么?

select date(STR_TO_DATE('2015-01', '%Y-%m')) + INTERVAL 1 DAY;

这是 MySQL 5.55.6的 SQL Fiddle 。STR_TO_DATE在这两种情况下都返回一个日期。使用DATE作品转换结果。尝试添加INTERVAL. INTERVAL添加to STR_TO_DATE(...)or没关系DATE(STR_TO_DATE(...)),结果是一样的。但是,删除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
;

我搜索了发行说明,但找不到任何东西。到底是怎么回事?这是已知的变化吗?一个错误?

4

1 回答 1

2

这是一个已知的变化,在不知情的情况下被引入到版本5.1.595.5.165.6.3中(但随后在版本5.1.625.5.21中回滚;它保留在 5.6 行中):

不兼容的更改:修改了与日期相关的断言的处理。

但是,此更改的结果是,当将函数值作为参数传递DATE()并拒绝日期部分为零的不完整日期时,一些函数变得更加严格。这些功能受到影响:CONVERT_TZ(), DATE_ADD(), DATE_SUB(), DAYOFYEAR(), LAST_DAY(), TIMESTAMPDIFF(), TO_DAYS(), TO_SECONDS(), WEEK(), WEEKDAY(), WEEKOFYEAR(), YEARWEEK(). 因为这改变了通用可用性状态系列(MySQL 5.1 和 5.5)中的日期处理行为,所以它在 5.1.62 和 5.5.21 中被恢复。更改保留在 MySQL 5.6 中。

参考:另见错误 #13458237。

您会受到影响,因为+ INTERVAL符号只是DATE_ADD()函数周围的语法糖。

于 2016-01-16T21:59:09.237 回答