【问题标题】:MySQL check if two date range overlap with inputMySQL检查两个日期范围是否与输入重叠
【发布时间】:2020-10-28 22:19:13
【问题描述】:

我需要检查两个日期是否与我数据库中的另外两个日期重叠。

我的数据库是这样的

+----+--------------+------------+------------+
| id | code         | StartDate  | EndDate    |
+----+--------------+------------+------------+
|  1 | KUVX-21-40   | 2013-10-23 | 2013-11-22 |
|  2 | UEXA286-1273 | 2013-10-30 | 2013-11-29 |
|  3 | UAJFAU-2817  | 2013-10-21 | 2013-11-20 |
|  4 | KUVX-21-40   | 2013-10-30 | 2013-11-29 |
+----+--------------+------------+------------+

在我的查询中,我指定了范围:开始日期和结束日期 让我们按如下方式分配它们:

ScopeStartDate = "2013-10-1"
ScopeEndDate = "2013-11-26"

上面应该返回我所有的记录,因为所有的记录都超过了时间跨度。

但是我无法让查询正常工作:/

我尝试了以下查询,但没有成功:

WHERE
(
    (StartDate < ScopeStartDate AND StartDate > ScopeStartDate)
    OR
    (StartDate > ScopeStartDate  AND EndDate < ScopeEndDate )
)

这会返回两个结果: 1 和 3

我做错了什么?

【问题讨论】:

  • 如果我明白你想要什么,这应该是“OR”的“AND”
  • (StartDate &lt; ScopeStartDate AND StartDate &gt; ScopeStartDate) 怎么可能是真的?它不能更大也不能更小。
  • 正确,比较器也是错误的。

标签: mysql sql datetime


【解决方案1】:

我相信以下条件匹配所有可能的重叠情况。

WHERE
(
    (ScopeStartDate <= EndDate AND ScopeEndDate >= StartDate)

)

除非您声明不合逻辑的时间跨度(例如,在开始之前结束的时间跨度)

【讨论】:

  • 如果我将scopeStartDate 作为2013-09-23scopeEndDate 作为2013-11-02 传递,此条件不会失败。考虑到上述查询:| 1 | KUVX-21-40 | 2013-10-23 | 2013-11-22 |此记录不满足您的条件,但日期重叠。
  • scopeStartDate =2013-09-23,检查。
【解决方案2】:

这是一个旧线程,但使用 BETWEEN。这是我的时钟节选,请根据您的需要修改...

$qs = "SELECT COUNT(*) AS `count` FROM `timeclock` WHERE `userid` = :userid 
                AND (
                    (`timein` BETWEEN :timein AND :timeout OR `timeout` BETWEEN :timein AND :timeout )
                    OR
                    (:timein BETWEEN `timein` AND `timeout` OR :timeout BETWEEN `timein` AND `timeout`)
                    );";

【讨论】:

    【解决方案3】:

    这只是 where 子句。给定 InputStartDate 和 InputEndDate 由用户输入给定,DataStartDate 和 DataEndDate 是表中的日期时间值:

    where ((DataEndDate > InputStartDate) and (DataStartDate < InputEndDate))
    

    【讨论】:

      【解决方案4】:

      即使数据库中的toDate 可能为空,您也可以涵盖所有日期重叠情况,如下所示:

      SELECT * FROM `tableName` t
      WHERE t.`startDate` <= $toDate
      AND (t.`endDate` IS NULL OR t.`endDate` >= $startDate);
      

      无论如何这将返回与新开始/结束日期重叠的所有记录。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-20
        • 2011-02-02
        • 1970-01-01
        • 2011-07-02
        相关资源
        最近更新 更多