MySQL between and 边界测试
看到有一些博客说 between and 有不含边界的情况,于是测试了一把,记录如下。先说结论:between and 不存在不含边界的情况
1. between and 是包含边界的
id between 3 and 5 等价于 id >=3 and <=5;
mysql> select * from t1; +----+--------+------+ | id | name | age | +----+--------+------+ | 1 | siri01 | 200 | | 2 | siri02 | 30 | | 3 | siri20 | 40 | | 4 | siri31 | 22 | | 5 | siri04 | 60 | | 7 | siri30 | 80 | | 8 | siri43 | 100 | | 9 | siri40 | 25 | | 10 | siri15 | 20 | | 15 | siri06 | 100 | | 20 | siri89 | 400 | +----+--------+------+ mysql> select * from t1 where id between 3 and 5; +----+--------+------+ | id | name | age | +----+--------+------+ | 3 | siri20 | 40 | | 4 | siri31 | 22 | | 5 | siri04 | 60 | +----+--------+------+ 3 rows in set (0.00 sec) mysql> select * from t1 where id not between 3 and 5; +----+--------+------+ | id | name | age | +----+--------+------+ | 1 | siri01 | 200 | | 2 | siri02 | 30 | | 7 | siri30 | 80 | | 8 | siri43 | 100 | | 9 | siri40 | 25 | | 10 | siri15 | 20 | | 15 | siri06 | 100 | | 20 | siri89 | 400 | +----+--------+------+ 8 rows in set (0.00 sec)
2. between and ,datetime 类型的字段
mysql> create table t3(id bigint primary key auto_increment,date datetime); mysql> select * from t3; +----+---------------------+ | id | date | +----+---------------------+ | 1 | 2021-06-16 03:00:00 | | 2 | 2021-06-15 00:00:00 | | 3 | 2021-06-14 00:00:00 | | 4 | 2021-06-13 01:00:00 | | 5 | 2021-06-12 09:00:00 | +----+---------------------+ mysql> select * from t3 where date between '2021-06-13' and '2021-06-15'; +----+---------------------+ | id | date | +----+---------------------+ | 2 | 2021-06-15 00:00:00 | | 3 | 2021-06-14 00:00:00 | | 4 | 2021-06-13 01:00:00 | +----+---------------------+ MySQL 对日期的查询默认是 00:00:00, 上面的查询实际上是 between '2021-06-13 00:00:00' and '2021-06-15 00:00:00' mysql> select * from t3 where date between '2021-06-13' and '2021-06-16'; +----+---------------------+ | id | date | +----+---------------------+ | 2 | 2021-06-15 00:00:00 | | 3 | 2021-06-14 00:00:00 | | 4 | 2021-06-13 01:00:00 | +----+---------------------+ 虽然有一条 2021-06-16 的记录,但是不满足 00:00:00 的查询条件。并不是不包含边界。这里容易造成一种不含边界的错觉。 像 datatinme 的字段查询,查询日期应 cast('2021-06-13' data) 转换一下类型。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统