2

我收到这个错误

操作的排序规则的非法混合<=

对于以下 WHERE 子句:

time(table1.dt1)<=date_add(table1.tim,interval 60 second)

dt1 = datetime,tim = time

有人知道为什么吗?

4

1 回答 1

2
  1. 如手册条目中所述DATE_ADD()

    返回值取决于参数:

    • DATETIME如果第一个参数是DATETIME(或TIMESTAMP)值,或者如果第一个参数是 aDATE并且单位值使用HOURSMINUTESSECONDS

    • 否则字符串。

    在您的情况下,因为table1.tim是一个TIME值,所以该函数返回一个字符串。

    字符串以 and 给出的字符集和排序规则character_set_connection返回collation_connection

  2. 如手册条目中所述TIME()

    提取时间或日期时间表达式的时间部分expr并将其作为字符串返回。

    该字符串作为二进制字符串返回(为什么不使用连接字符集和排序规则超出了我的范围——也许是一个错误?)。

  3. 正如在表达式评估中的类型转换的手册条目中所解释的:

    如果比较操作中的两个参数都是字符串,则将它们作为字符串进行比较。

    因此,所进行的比较是字符串比较,但binary不能将字符串强制转换为合适的排序规则进行比较(因为它的编码未知)。因此,您正在目睹的错误。

可以通过显式转换一个或两个操作数来强制正确进行比较,但我很想重新编写该子句,以便从与类型的比较中隐式进行转换TIME

TIME(table1.dt1 - INTERVAL 1 MINUTE) <= table1.tim
于 2012-08-21T11:29:05.223 回答