MySQL中 BETWEEN ... AND ...

1. 准备测试数据

CREATE TABLE `student` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`age` int(11) NOT NULL,
`create_time` datetime DEFAULT NULL,
`birthday` date DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB EFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
INSERT INTO `test`.`student`(`id`, `name`, `age`, `create_time`, `birthday`) VALUES
(1, 'Andy', 10, '2021-02-01 00:00:00', '2021-01-30'),
(2, 'Ben', 18, '2021-02-01 00:00:01', '2021-01-31'),
(3, 'Cindy', 18, '2021-02-01 12:01:54', '2021-02-01'),
(4, 'David', 18, '2021-02-01 23:59:59', '2021-02-02'),
(5, 'Cindy2', 18, '2021-02-02 00:00:00', '2021-02-03'),
(6, 'Cindy3', 19, '2021-02-02 00:00:01', '2021-02-28'),
(7, 'Cindy4', 19, '2021-11-22 12:19:33', '2021-02-28');

2. 如果列是date类型,则 BETWEEN ... AND ... 包含左右区间

如:筛选 生日为2021-02-012021-02-02 的学生

写法1:SELECT * FROM student WHERE birthday BETWEEN '2021-02-01' AND '2021-02-02'

写法2:SELECT * FROM student WHERE birthday >= '2021-02-01' AND birthday <= '2021-02-02'

结果均为:

3. 如果列是datetime类型,则需分情况讨论

3.1 如果传入的参数格式为datetime格式,则仍包含左右区间

如:筛选 create_time2021-02-21 的所有数据,即2021-02-01 00:00:002021-02-01 23:59:59

写法1:SELECT * FROM student WHERE create_time BETWEEN '2021-02-01 00:00:00' AND '2021-02-01 23:59:59'

写法2:SELECT * FROM student WHERE create_time >= '2021-02-01 00:00:00' AND create_time <= '2021-02-01 23:59:59'

结果均为:

3.2 如果传入的格式是date格式,此时需要注意一些边界情况

如:需求同上,筛选 create_time2021-02-21 的所有数据,但不指定时分秒:

SELECT * FROM student WHERE create_time BETWEEN '2021-02-01' AND '2021-02-01'

显然数据有误,只查出来 2021-02-01 00:00:00 的数据,出现这种现象的原因,就是因为如果针对datetime列的字段做筛选,但输入的值却是date类型的话,默认会自动追加00:00:00

因此,上一句SQL实际上会被自动转成如下格式:

SELECT * FROM student WHERE create_time BETWEEN '2021-02-01 00:00:00' AND '2021-02-01 00:00:00'

这才出现了只查询到2021-02-01 00:00:00 的数据的情况

MySQL中 BETWEEN ... AND ...的更多相关文章

  1. MySQL中You can't specify target table for update in FROM clause一场

    mysql中You can't specify target table <tbl> for update in FROM clause错误的意思是说,不能先select出同一表中的某些值 ...

  2. MySql中in和exists效率

    mysql中的in语句是把外表和内表作hash 连接,而exists语句是对外表作loop循环,每次loop循环再对内表进行查询.一直大家都认为exists比in语句的效率要高,这种说法其实是不准确的 ...

  3. [原创]MYSQL中利用外键实现级联删除和更新

    MySQL中利用外键实现级联删除.更新 MySQL支持外键的存储引擎只有InnoDB,在创建外键的时候,要求父表必须有对应的索引,子表在创建外键的时候也会自动创建对应的索引.在创建索引的时候,可以指定 ...

  4. mysql中的多行查询结果合并成一个

    SELECT GROUP_CONCAT(md.data1) FROM DATA md,contacts cc WHERE md.conskey=cc.id AND md.mimetype_id= 5 ...

  5. 【转】MySql中的函数

    原文:http://www.cnblogs.com/kissdodog/p/4168721.html MySQL数据库提供了很多函数包括: 数学函数: 字符串函数: 日期和时间函数: 条件判断函数: ...

  6. sqlserver 中数据导入到mysql中的方法以及注意事项

    数据导入从sql server 到mysql (将数据以文本格式从sqlserver中导出,注意编码格式,再将文本文件导入mysql中): 1.若从slqserver中导出的表中不包含中文采用: bc ...

  7. MySQL中有关TIMESTAMP和DATETIME的总结

    一.MySQL中如何表示当前时间? 其实,表达方式还是蛮多的,汇总如下: CURRENT_TIMESTAMP CURRENT_TIMESTAMP() NOW() LOCALTIME LOCALTIME ...

  8. MySQL中索引和优化的用法总结

    1.什么是数据库中的索引?索引有什么作用? 引入索引的目的是为了加快查询速度.如果数据量很大,大的查询要从硬盘加载数据到内存当中. 2.InnoDB中的索引原理是怎么样的? InnoDB是Mysql的 ...

  9. B-Tree索引在sqlserver和mysql中的应用

    在谈论数据库性能优化的时候,通常都会提到“索引”,但很多人其实并没有真正理解索引,也没有搞清楚索引为什么就能加快检索速度,以至于在实践中并不能很好的应用索引.事实上,索引是一种廉价而且十分有效的优化手 ...

  10. MySQL中CURRENT_TIMESTAMP(转)

    1. MySQL 获得当前时间戳函数:current_timestamp, current_timestamp()  代码如下   mysql> select current_timestamp ...

随机推荐

  1. CSS基础 margin塌陷问题以及解决 办法

    场景:两个相互嵌套的块级元素,父子元素相互紧贴margin-top会合并作用在父元素的子元素结果:导致两个盒子同时移动 解决方法: 1.给父元素设置overflow:hidden 2.给父元素设置浮动 ...

  2. Pytest_allure报告(11)

    一.allure工具环境配置 windows安装allure 1.下载allure工具包 进入工具包官网:https://github.com/allure-framework/allure2/rel ...

  3. Jmeter创建一个http请求

    1.点击'Test Plan'为测试计划命名为"创建用户接口" 2.新建一个[线程组],在[创建用户接口]处点击右键,选择[添加]-->[Threads(Users)]--& ...

  4. [BJDCTF2020]EzPHP-POP链

    那次某信内部比赛中有道pop链问题的题目,我当时没有做出来,所以在此总结一下,本次以buu上复现的[MRCTF2020]Ezpop为例. 题目 1 Welcome to index.php 2 < ...

  5. mysql之突破secure_file_priv写webshell

    在某些情况下,当我们进入了一个网站的phpMyAdmin时,想通过select into outfile来写shell,但是通常都会报错. 这是因为在mysql 5.6.34版本以后 secure_f ...

  6. SpringBoot2.4.2下配置Lettuce使用Redis

    1. Springboot2.4.2下对Redis的基础集成 1.1 maven添加依赖 <dependency> <groupId>org.springframework.b ...

  7. day 14 C语言strcmp()函数:比较两个字符串

    (1).下列关于C语言文件的叙述中正确的是[C] (A).文件由一系列数据依次排列组成,只能构成二进制文件 (B).文件由结结构序列组成,可以构成二进制文件或文本文件 (C).文件由数据序列组成,可以 ...

  8. 《剑指offer》面试题47. 礼物的最大价值

    问题描述 在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0).你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格.直到到达棋盘的右下角.给定一个棋盘及 ...

  9. Three.js之绘制物体的边框及修改lineWidth

    本博文主要记录如何使用three.js绘制物体的边框及修改其lineWidth.three.js是个技术点比较多,查询资料又比较少的框架,单单就这个修改lineWidth就是一个坑.先放一个动态的效果 ...

  10. Ultimaker2+使用指南

    USB打印 使用最新的官方软件即可进行USB3D打印. 使用时在选项上进行预热以及x,y,z重新归零定位,每次开始都要做. SD卡打印 比较方便,因为电脑可能拿去做其他事情. 打印机堵塞 退出耗材时候 ...