首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >非法组合整理以供日期/时间比较的操作

问非法组合整理以供日期/时间比较的操作
EN

Stack Overflow用户
提问于 2012-08-21 09:48:17
回答 1查看 2K关注 0票数 2

我知道这个错误

用于<=操作的非法排序组合

适用于下列WHERE条款:

代码语言:javascript
复制
time(table1.dt1)<=date_add(table1.tim,interval 60 second)

dt1 = datetime,tim = time

有人知道为什么吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-21 11:29:05

  1. 正如DATE_ADD()手册中所解释的那样: 返回值取决于参数:
代码语言:javascript
复制
- [`DATETIME`](http://dev.mysql.com/doc/en/datetime.html) if the first argument is a [`DATETIME`](http://dev.mysql.com/doc/en/datetime.html) (or [`TIMESTAMP`](http://dev.mysql.com/doc/en/datetime.html)) value, or if the first argument is a [`DATE`](http://dev.mysql.com/doc/en/datetime.html) and the unit value uses `HOURS`, `MINUTES`, or `SECONDS`.
- String otherwise.

在您的示例中,因为table1.tim是一个TIME值,所以函数将返回一个字符串。

字符串在character_set_connection和collation_connection提供的字符集和排序规则中返回。

  1. 正如TIME()手册中所解释的那样: 提取时间或日期时间表达式expr的时间部分,并将其作为字符串返回。

字符串作为二进制字符串返回(为什么不使用连接字符集&排序规则超出了我的权限--也许是个bug)。

  1. 正如表达式计算中的类型转换手册中所解释的那样: 如果比较操作中的两个参数都是字符串,则将它们作为字符串进行比较。

因此,进行的比较是字符串比较,但是不能强迫binary字符串进行比较(因为它的编码不知道)。因此,你所目睹的错误。

可以强制通过显式铸造之一或两个操作数正确地进行比较,但我只想重做子句,以便从对TIME类型的比较中隐式地进行转换:

代码语言:javascript
复制
TIME(table1.dt1 - INTERVAL 1 MINUTE) <= table1.tim
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12052254

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档