开发者

MySQL BETWEEN AND踩坑记录

目录
  • mysql BETWEEN AND踩坑
    • 解决思路
  • MySQL之between ...and....小知识点
    • 带BETWEEN AND关键字的查询
    • 带NOT BETWEEN AND关键字的查询
  • 总结

    MySQL BETWEEN AND踩坑

    在日常使用MySQL的过程http://www.devze.com中,我们很习惯性的会使用“BETWEEN … AND…”来进行条件查询,筛选对应时间、状态的数据。

    但,如果这个日期字段是日期/时间格式,那么坑就来了。

    SELECT 
    	* # 正式学习工作尽量不要直接使用 *,这里是自建的模拟表无所谓
    FROM 
    	test 
    WHERE 
    	time BETWEEN '2023-04-01' AND '2023-04-20'
    ORDER BY 
    	time desc

    输出结果:

    MySQL BETWEEN AND踩坑记录

    但是!

    实际上我们的表中是有2023-04-20这一天的数据的

    SELECT 
    	*
    FROM 
    	test 
    WHERE 
    	DATE(time) = '2023-04-20'

    MySQL BETWEEN AND踩坑记录

    MySQL的BETWEEN ... AND...的取值确实是闭区间,但是如果日期字段包含时间,即2023-04-20 09:23:35

    MySQL会将BETWEEN '2023-04-01' AND '2023-04-20'自动转换为BETWEEN '2023-04-01 00:00:00' AND '2023-04-20 00:00:00'

    也就是说,当日期字段带时间时,最后一天仅会获取00:00:00这一时间点的数据,而非我们想象中的最后一天一整天的数据!

    解决思路

    1.使用DATE()

    DATE(time) BETWEEN '2023-04-01' AND '2023-04-20'

    2.使用小于号,小于最后一天的后一天

    time >= '2023-04-01' and time < '2023编程客栈-04-21'

    3.手动补上时间(不建议,麻烦且可能出现更多坑)

    time BETWEEN '2023-04-01 00:00:00.000000' AND '2023-04-20 23:59:59.999999'

    MySQL之between ...and....小知识点

    使用BETWEEN AND关键字检索数据表中指定的数据内容。

    带BETWEEN AND关键字的查询

    我们已经学会了如何用IN关键字精确查询数据表中的内容,但是在很多时候,我们编程客栈仅仅是想知道在某一范围内有多少符合条件的数据,这就不得不使用到关键字BETWEEN AND了,它是闭区间,前后都可以取到

    BETWEEN AND需要两个参数支持,一个是范围的开始值,另一个就是结束值了。

    如果字段值满足指定的范围查询条件,就返回这些满足条件的数据内容。

    语法规则为:

    SELECT 字段名 FROM 表名 WHERE 字段名 BETWEEN n1 AND n2编程; ​​​​​​​

    举个例子假设我们现在有一张表Mall_products,

    内容如下:

    MySQL BETWEEN AND踩坑记录

    我们将使用BETWEEN AND关键字检索出所有国家代码为1~50的商品的信息。

    查询代码如下:

    SELECT *
    FROM Mall_products
    WHERE prod_country BETWEEN 1 AND 50;

    结果为:

    MySQL BETWEEN AND踩坑记录

    查询过程如下:

    MySQL BETWEEN AND踩坑记录

    可以看到,返回结果包含了国家代码从1~50之间的字段值。尤其值得注意的是,端点值1也包含在返回结果中

    带NOT BETWEEN AND关键字的查询

    像上一关介绍的关键字IN一样,我们还可以对关键字BETWEEN AND进行取反,表示查询指定范围之外的值。

    语法规则为:

    SELECT 字段名 FROM 表名 WHERE 字段名 NOT BETWEEN n1 AND n2; ​​​​​​​

    举个例子我们依然使用表Mall_products。

    现在我们想要查询除了国家代码为1~50的所有国家的产品内容。

    查询代码如下:

    SELECT *
    FROM Mall_products
    WHERE prodpython_country NOT BETWEEN 1 AND 50;

    结果为:

    MySQL BETWEEN AND踩坑记录

    由结果可以看出,返回的结果只有大于国家代码50的内容。

    怎么样?简单吧!

    总结

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。

    0

    上一篇:

    下一篇:

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    最新数据库

    数据库排行榜