STR_TO_DATE MySQL 5.5和MySQL 5.6之间的差异

时间:2016-01-16 20:44:47

标签: mysql sql str-to-date

此SQL在MySQL 5.5中返回DATE,但在MySQL 5.6中返回NULL。为什么呢?

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

这是MySQL 5.55.6的SQL小提琴。 STR_TO_DATE在两个实例中都返回一个日期。使用DATE转换结果有效。尝试添加INTERVAL时出现问题。如果我将INTERVAL添加到STR_TO_DATE(...)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
;

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

1 个答案:

答案 0 :(得分:2)

这是一项众所周知的变更,无意中被引入版本5.1.595.5.165.6.3(但随后在版本5.1.62和{{ 3}};它保留在5.6行中:

  

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

     

然而,这种变化的结果是,当传递5.5.21函数值作为参数时,几个函数变得更加严格,并且拒绝一天零部分的不完整日期。这些功能受到影响:DATE()CONVERT_TZ()DATE_ADD()DATE_SUB()DAYOFYEAR()LAST_DAY()TIMESTAMPDIFF(),{{3 }},TO_DAYS()TO_SECONDS()WEEK()WEEKDAY()。因为这会更改一般可用性状态系列(MySQL 5.1和5.5)中的日期处理行为,所以它在5.1.62和5.5.21中还原。该变化保留在MySQL 5.6中。

     

参考文献:另见Bug#13458237。

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