TIMESTAMPDIFF的报错

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。

  • 【TiDB 版本】:v3.1
  • 【问题描述】:

很奇怪的一个错误,tb_customer是一个会员表,c_org_id是主键,c_born_date是生日,

1、执行以下语句会报错

select * from tb_customer
where TIMESTAMPDIFF(YEAR, c_born_date, now()) <18
and c_org_id = ‘8’

[Err] 1105 - other error: Eval error: UnknownSignature(TimestampDiff)

2、执行以下语句不报错

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

3、执行以下语句不报错

select * from (
select * from tb_customer
limit 2
) t
where TIMESTAMPDIFF(YEAR, c_born_date, now()) <18
and c_org_id = ‘8’

4、执行以下语句会报相同的错误,其中c_no为上面语句的结果

select * from (
select * from tb_customer
where c_no in (‘123’,‘456’)
) t
where TIMESTAMPDIFF(YEAR, c_born_date, now()) <18
and c_org_id = ‘8’

同时,以上报错语句在本地单机部署环境中不报错,在生产环境集群部署下报错。

若提问为性能优化、故障排查类问题,请下载脚本运行。终端输出打印结果,请务必全选并复制粘贴上传。

1 个赞

你好,

你的问题已收到,正在分析,请稍等。

可以先反馈下

1、 生产环境和测试环境版本分别为多少。

都是v3.1

可能和数据问题,我copy出来一个表结构,没有数据,在copy中查询,就不报错

你好,

方便提供下脱敏的表结构,如果可以给你测试数据这边验证下。

我刚试了一下, copy表里只插入一条时间大于当前时间的数据,会报错。但是去掉c_org_id后也不报错。 copy表里只插入一条时间小于当前时间的数据,不会报错。

稍等,我导出一下

SET FOREIGN_KEY_CHECKS=0; DROP TABLE IF EXISTS tb_customer_copy; CREATE TABLE tb_customer_copy ( c_born_date datetime DEFAULT NULL, c_org_id varchar(10) COLLATE utf8_bin NOT NULL DEFAULT ‘’, PRIMARY KEY (c_org_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;

现在比较奇怪的是,只有生产环境有这个问题,不知道是不是哪里配置有问题。

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

本来想用上面的写法的,但是报错

Other("[src/coprocessor/codec/mysql/time/mod.rs:93]: ‘1948-5-1 0:0:0.000000000’ is not a valid datetime in specified time zone")

就用了timestampdiff,结果又报现在这种错误。。。

你好,

我这边验证下。不知是否使用的是三方连接工具?

尝试使用 mysql -uroot -p -P -h 连接执行是否报错。

好的,稍等,我试试

不过,这个最开始是程序里报错,然后在navacit中重现出来的。我先试试吧

:sweat_smile:提示mysql未找到命令是个什么情况

我本地可以啊,生产环境不行

tidb 需要 mysql-client 来连接,所以请确定线上是否安装 mysql-server 服务,没有可以安装下。。。

应该有吧,都用了大半年了。。。我问一下同事吧

问了,是只装了tidb,没装mysql命令行

可以在安装好 mysql-server 在命令行试下哈

image

一样的错误