# [KB] TiDB 时间日期列与非时间日期类型的常量进行比较时结果出错

## Key Words

TiDB, wrong result, date, datetime

## Description

v4.x 升级到 v5.x 升级后对条件 `a.CREATED_DATE > CURDATE()-1 and a.CREATED_DATE < CURDATE() indexrangescan` 范围为 :`\[-inf,2022-10-02 00:00:00)` 导致过滤了很多不在查询范围内的数据，查询结果出现错误。

## Root Cause

4.x -> 5.x 中由 PR [20961](https://github.com/pingcap/tidb/pull/20961) 引入，这个 PR 本身是为了修复 issue [17868](https://github.com/pingcap/tidb/issues/17868)。该 pr 影响时间日期列与非时间日期类型的常量进行比较时，进行的类型转换操作。当时间日期列与数字常量比较时：该 pr 以前，TiDB 会将常量转换成日期类型；该 pr 之后，tidb 会将时间日期列转换成数字类型。这就导致：

* 表达式 `CURDATE()-1` 会在优化过程中被常量折叠，其中 CURDATE() 为日期类型，在 -1 之后会变成整数类型，也就是 20221001。这个行为在两个版本中相同。
* 对于时间日期列，不仅包含日期，也包含时间，转换成数字之后会成为形如 20221001130000 的数字，而 CURDATE() 获取的只有日期，转换成的数字形如 20221001，就让这个条件几乎恒为 true 了。

## Diagnostic Steps

NA

## Resolution

暂未有修复。

## Workaround

调整 SQL 将非时间日期类型的常量转换成时间日期类型，避免 TiDB 的自动隐式转换。

## Affected Versions

v5.0.0 以后所有版本