假设我们有一张表:test

    1. CREATE TABLE `test` (
    2. `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
    3. `start_time` DATETIME NULL DEFAULT NULL COMMENT '开始时间',
    4. `end_time` DATETIME NULL DEFAULT NULL COMMENT '结束时间',
    5. PRIMARY KEY (`id`) USING BTREE
    6. )
    7. COLLATE='utf8_unicode_ci'
    8. ENGINE=INNODB
    9. ;

    然后插入一条数据:

    1. INSERT INTO `test` (`start_time`, `end_time`) VALUES ('2020-08-04 10:00:00', '2020-08-04 12:00:00');

    然后我们查询看看:

    1. select * from test;
    2. +----+---------------------+---------------------+
    3. | id | start_time | end_time |
    4. +----+---------------------+---------------------+
    5. | 1 | 2020-08-04 10:00:00 | 2020-08-04 12:00:00 |
    6. +----+---------------------+---------------------+
    7. 1 row in set (0.00 sec)

    接下来我们就可以来写sql语句了:

    1. SET @BeignTime = '2020-08-04 05:00:00';
    2. SET @EndTime = '2020-08-04 10:00:00';
    3. SELECT *
    4. FROM test
    5. WHERE (
    6. @BeignTime BETWEEN start_time AND end_time OR
    7. @EndTime BETWEEN start_time AND end_time OR
    8. start_time BETWEEN @BeignTime AND @EndTime OR
    9. end_time BETWEEN @BeignTime AND @EndTime
    10. );
    11. +----+---------------------+---------------------+
    12. | id | start_time | end_time |
    13. +----+---------------------+---------------------+
    14. | 1 | 2020-08-04 10:00:00 | 2020-08-04 12:00:00 |
    15. +----+---------------------+---------------------+
    16. 1 row in set (0.00 sec)
    17. SET @BeignTime = '2020-08-04 05:00:00';
    18. SET @EndTime = '2020-08-04 09:00:00';
    19. SELECT *
    20. FROM test
    21. WHERE (
    22. @BeignTime BETWEEN start_time AND end_time OR
    23. @EndTime BETWEEN start_time AND end_time OR
    24. start_time BETWEEN @BeignTime AND @EndTime OR
    25. end_time BETWEEN @BeignTime AND @EndTime
    26. );
    27. Empty set (0.00 sec)

    可以像下面这样:

    1. SET @BeignTime = '2020-08-04 05:00:00';
    2. SET @EndTime = '2020-08-04 09:00:00';
    3. SELECT *
    4. FROM test
    5. WHERE (
    6. (@BeignTime >= start_time AND @BeignTime <= end_time) OR
    7. (@EndTime >= start_time AND @EndTime <= end_time) OR
    8. (start_time >= @BeignTime AND start_time <= @EndTime) OR
    9. (end_time >= @BeignTime AND end_time <= @EndTime)
    10. );
    11. Empty set (0.00 sec)
    12. SET @BeignTime = '2020-08-04 05:00:00';
    13. SET @EndTime = '2020-08-04 10:00:00';
    14. SELECT *
    15. FROM test
    16. WHERE (
    17. (@BeignTime >= start_time AND @BeignTime <= end_time) OR
    18. (@EndTime >= start_time AND @EndTime <= end_time) OR
    19. (start_time >= @BeignTime AND start_time <= @EndTime) OR
    20. (end_time >= @BeignTime AND end_time <= @EndTime)
    21. );
    22. +----+---------------------+---------------------+
    23. | id | start_time | end_time |
    24. +----+---------------------+---------------------+
    25. | 1 | 2020-08-04 10:00:00 | 2020-08-04 12:00:00 |
    26. +----+---------------------+---------------------+
    27. 1 row in set (0.00 sec)