【问题标题】:Overlapping date range MySQL重叠的日期范围 MySQL
【发布时间】:2010-09-08 12:24:21
【问题描述】:

我有以下数据;

ID  startDate               endDate
-----------------------------------------------
1   2010-03-01 10:00:00     2010-03-01 12:00:00
2   2010-03-01 12:30:00     2010-03-01 15:30:00
3   2010-03-01 15:30:00     2010-03-01 18:30:00

我想要做的是检查开始日期和结束日期不在我的数据中的 startDate 和 endDate 范围内。

因此,例如,以下是可以的;

startDate               endDate
-----------------------------------------------
2010-03-01 12:00:00     2010-03-01 12:30:00
2010-03-01 18:30:00     2010-03-01 21:00:00

但以下日期会失败,因为它们会重叠;

startDate               endDate
-----------------------------------------------
2010-03-01 09:00:00     2010-03-01 13:00:00 (overlaps ID 1)
2010-03-01 10:30:00     2010-03-01 11:00:00 (overlaps ID 1)
2010-03-01 18:00:00     2010-03-01 19:00:00 (overlaps ID 3)

我正在拔头发,因为我可以让上述 3 个测试日期范围中的一个或两个不及格,但不是全部。

我正在使用 MySQL。

【问题讨论】:

    标签: php mysql datetime


    【解决方案1】:

    选择重叠的查询(我将列命名为 startTime 和 endTime,因为时间似乎很重要......):

    WHERE 
    <start> < endDate
    AND
    <end> > startDate
    

    【讨论】:

    • 这几乎就是我在最后一行(我相信你在编辑过程中添加的)的内容!谢谢,你让我头疼了!
    • 我在其中编辑了另一个答案,想看看那个更短的解决方案是否可以?
    • 对不起,你的意思是“WHERE > startDate”?
    • 是的。我正是这个意思。不要让表面上的简单愚弄你,我认为它会起作用的。
    • 从逻辑上讲,它们应该是相同的,所以如果一个有效,另一个也有效(或者它们都失败/有相同的错误)
    【解决方案2】:

    这可能不是最好的方法,但也许你可以从这个例子中看到一些东西。只有当它们重叠时才会返回结果,我可能会在 not exists 查询中使用它。

    select 1 from myTable
    where 
    ('03/01/2010 09:00:00' between startDate and endDate)
    or
    ('03/01/2010 13:00:00' between startDate and endDate)
    or 
    (startDate between '03/01/2010 09:00:00' and '03/01/2010 13:00:00')
    or
    (endDate between '03/01/2010 09:00:00' and '03/01/2010 13:00:00')
    

    根据 Wrikken 的回答,您可能还需要检查这些值是否不完全匹配。

    【讨论】:

      【解决方案3】:

      重叠条目:

      SELECT t1.Id, t2.Id, t1.StartDate, t1.EndDate, t2.StartDate, t2.EndDate
      FROM Table t1, Table t2
      WHERE t1.ID <> t2.Id
      AND (t1.StartDate between t2.StartDate and t2.EndDate
          OR
           t1.EndDate between  t2.StartDate and t2.EndDate)
      

      【讨论】:

        猜你喜欢
        • 2011-02-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-18
        • 1970-01-01
        • 2018-03-03
        • 1970-01-01
        • 2012-04-15
        相关资源
        最近更新 更多