mysql - SQL:选择 * where start and end falls within two dates

标签 mysql sql date between

我有一个 tasks 表:

+-------+-------------------+---------------------+---------------------+
| rowid | title             | start_task          | due_date            |
+-------+-------------------+---------------------+---------------------+
| 1     | Paint Apartment   | 2018-03-01 07:00:00 | 2018-03-16 15:00:00 |
+-------+-------------------+---------------------+---------------------+
| 2     | Meeting with John | 2018-03-10 10:00:00 | 2018-03-10 12:30:00 |
+-------+-------------------+---------------------+---------------------+
| 3     | Buy Milk          | 2018-03-04 20:00:00 | NULL                |
+-------+-------------------+---------------------+---------------------+
| 4     | Renew Rail Card   | NULL                | 2018-03-07 09:00:00 |
+-------+-------------------+---------------------+---------------------+

我想选择 2018-03-052018-03-11 这周的所有内容,因此它应该打印第 1、2 和 4 行。

所以我的查询应该包括以下内容:

  1. 从 2018-03-05 到 2018-03-11 之间开始的所有内容
  2. 在 2018-03-05 和 2018-03-11 之间到期的一切
  3. start_task 和 due_date 期间在 2018-03-05 和 2018-03-11 之间的所有内容

我当前执行 1 和 2 并打印第 2 行和第 4 行的 SQL:

SELECT * FROM `tasks` tasks where ((`start_task` >= '2018-03-05 00:00:00' and `start_task` <= '2018-03-11 23:59:59') OR (`due_date` >= '2018-03-05 00:00:00' and `due_date` <= '2018-03-11 23:59:59'))

最佳答案

您正在检查两个间隔之间的非空交集(start_datedue_date 和 Mar 05 ➔ Mar 11)。

你可以这样做:

select *
  from `tasks` tasks
 where (`start_task` is null or `start_task` <= '2018-03-11 23:59:59') -- start <= end
   and (`due_date`   is null or `due_date`   >= '2018-03-05 00:00:00') -- end   >= start

(假设 null 开始/结束日期表示无限间隔)

记住它:“每个间隔必须在其他间隔结束之前开始”。


为了更好地理解原因,想想逆问题。

为了使两个间隔有一个空交集,您必须在 interval 1 开始之前让 interval 2 结束:

interval 1: --------(---)--------
interval 2: -(---)---------------

interval 2interval 1 结束后开始:

interval 1: --------(---)--------
interval 2: ---------------(---)-

否定这两个条件的合取并应用 De Morgan 得到非空交集的条件。

关于mysql - SQL:选择 * where start and end falls within two dates,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49127469/

相关文章:

mysql - 如何优化 'IN' 查询?

java - 如何从 Java 应用程序将 SQL 文件(存储在我的 Java 项目的源文件夹中)加载到 MySQL 中?

mysql - DATEDIFF() 参数问题

ios - 此日期时间响应的正确格式是什么

javascript - 日期构造函数在使用类似参数调用时会产生意外结果

mysql - 使用 SQL REGEXP 忽略数字并仅获取字符串和 '/'

python - 使用 Python 将数组插入 mysql

mysql - mysql扩展名已弃用,以后将删除:使用mysqli或PDO代替

php - 如何使用 PHP 将 MySQL 数据行放在适当的标题下?

java - Hibernate保存SQL异常