此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小提琴。 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
;
我查了发行说明但找不到任何东西。到底是怎么回事?这是一个已知的变化吗?一个错误?
答案 0 :(得分:2)
这是一项众所周知的变更,无意中被引入版本5.1.59,5.5.16和5.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()
函数周围的语法糖。