作者: WalterWj
问题描述
TiDB 版本从 5.1 升级到 6.5 后,相同 date_add 函数写法,升级前后执行结果不一致。
一开始的时候看到这个描述,第一个印象是个 bug。然后就拿着 SQL 进行复现分析。
问题分析
复现案例:
mysql 结果:
tidb 结果:
这个表现的原因是:
TiDB 新版本有相关行为变化,属于 MySQL 兼容性问题。
具体 PR 可以见:https://github.com/pingcap/tidb/pull/28133
也就是将 date_add 返回值改成了 string 类型,导致当前现象。
绕过方法
额外分析
实际上之前写法即使在 MySQL 中,也是不推荐写法,会导致结果不正确
这里可以看到结果是不预期的。
原始 SQL 的主要问题是它使用了字符串 '20240101' 来表示日期,而不是使用日期类型。这使得代码难以理解,并且容易出错。
最终结论
- 相关表现预期,是 TiDB 新版本行为有变化:https://github.com/pingcap/tidb/pull/28133 (也就是将 date_add 返回值改成了 string 类型,导致当前现象)
- 原始 SQL 用法不推荐,可能在一些时间下结果不正确,推荐修改写法。