zoukankan      html  css  js  c++  java
  • MySQL中 BETWEEN ... AND ...

    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');
    

    image-20211213113135543

    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'

    结果均为:

    image-20211213113227611

    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'

    结果均为:

    image-20211214093933622

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

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

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

    image-20211214093959502

    显然数据有误,只查出来 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 的数据的情况


    尊重写作权利,转载请注明出处 ^_^
  • 相关阅读:
    cobbler default system 网络安装时主机的menu上只有一个local选项
    tcpdump使用方法
    cobbler 修改 distro_signatures.json
    wireshark in text mode: tshark
    Mac OSX使用隐藏文件夹
    sql中多条件进行排序的问题
    Linux查看打日志文件
    XML Parser Error on line 39: 必须声明元素类型 "domainObjectRenamingRule"。
    Access denied for user '密码'@'192.18.0.0' (using password: YES)
    springboot之DevTools热部署的简单原理解析
  • 原文地址:https://www.cnblogs.com/convict/p/15686329.html
Copyright © 2011-2022 走看看