TIMESTAMPDIFF的报错

除了这两种方法之外,还有其他方法进行时间比较么?

select * from tb_customer where c_born_date > ‘2020-02-02’

select * from tb_customer where TIMESTAMPDIFF(YEAR, c_born_date, now()) <18

这边执行没有发现报错。请在检查下你这边的环境

问题就在这里了,我这边客户生产环境有问题,测试环境、演示环境、本地环境都没问题。。。 所以现在想问问,除了这两种报错的时间比较方式,还有其他时间比较方式么?

我这边是v3.1.0,不是beta

稍等,这边看下

  1. 请问相同的数据,在测试环境没有问题吗?
  2. 如果是,麻烦检查生产和测试的 sql_mode 是否一致,多谢。

image

和这个有问题么?客户那边是空,测试环境开始不是空,但我也改成空了,也没有报错

1、相同数据,在测试环境没问题。

2、sql_mode不一致,生产环境为空。 但是测试环境也改为空之后,执行语句没有报错。

现在我想找个替代方法,不使用timestampdiff来判断时间,有其他方式推荐么?

麻烦反馈下两个sql的执行计划,报错和不报错的.

执行 explain sql ,多谢

我看过往版本说明里有提及主键的影响

抱歉,我可能没有表达清楚,是生产环境和测试环境相同的sql,不是一个报错,一个不报错,麻烦反馈下信息,多谢。

哎?这差别有点大呀

  1. 看执行计划应该统计信息有问题

  2. 请查看SHOW STATS_HEALTHY where table_name=‘tb_customer_copy’ ; 检查健康度

  3. 如果健康度比较低,在业务低峰期执行收集统计信息的命令 ANALYZE TABLE schema.table_name; 看看能否走正确的执行计划

  4. 对于走错执行计划报错的问题,我们再看下,多谢。

这个表是我刚新copy出来的,我看看

:joy:healthy的值是0,是什么情况

我屈服了,我准备换种方式计算年龄:

SELECT ROUND(DATEDIFF(CURDATE(), @birthday)/365.2422)

  1. 抱歉,这个问题是由于错误下推到了 tikv,实际上 timestampdiff 在tikv没有支持. 在后面会修复
  2. 可以执行以下命令,禁止下推到tikv。

insert into mysql.expr_pushdown_blacklist values(‘timestampdiff’);

admin reload expr_pushdown_blacklist;

  1. 不过需要记录,以后升级的时候,最好可以删除。

好的,谢谢。 我暂时换一种写法就可以,这里对计算结果的准确性要求不是很高。再次感谢。

麻烦了,多谢反馈

此话题已在最后回复的 1 分钟后被自动关闭。不再允许新回复。