开发者社区> 问答> 正文

比较日期范围

在MySQL中,如果我有日期范围的列表(范围开始和范围结束)。例如

10/06/1983 to 14/06/1983 15/07/1983 to 16/07/1983 18/07/1983 to 18/07/1983 我想检查另一个日期范围是否包含列表中已经存在的任何范围,我该怎么做?

例如

06/06/1983 to 18/06/1983 = IN LIST 10/06/1983 to 11/06/1983 = IN LIST 14/07/1983 to 14/07/1983 = NOT IN LIST

展开
收起
保持可爱mmm 2020-05-10 20:45:43 474 0
1 条回答
写回答
取消 提交回答
  • 这是一个经典问题,如果您逆转逻辑,实际上会更容易。

    让我举一个例子。

    我将在此处发布一个时间段,以及其他时间段的所有不同变体以某种方式重叠。

           |-------------------|          compare to this one
               |---------|                contained within
           |----------|                   contained within, equal start
                   |-----------|          contained within, equal end
           |-------------------|          contained within, equal start+end
     |------------|                       not fully contained, overlaps start
                   |---------------|      not fully contained, overlaps end
     |-------------------------|          overlaps start, bigger
           |-----------------------|      overlaps end, bigger
     |------------------------------|     overlaps entire period
    

    另一方面,让我发布所有不重叠的内容:

           |-------------------|          compare to this one
     |---|                                ends before
                                 |---|    starts after
    

    因此,如果您简单地将比较简化为:

    starts after end ends before start 那么您将找到所有不重叠的部分,然后找到所有不匹配的期间。

    对于最后一个NOT IN LIST示例,您可以看到它与这两个规则匹配。

    您将需要确定以下时间段是在您的范围之内还是之外:

           |-------------|
    

    |-------| equal end with start of comparison period |-----| equal start with end of comparison period 如果您的表具有名为range_end和range_start的列,则以下是一些简单的SQL来检索所有匹配的行:

    SELECT * FROM periods WHERE NOT (range_start > @check_period_end OR range_end < @check_period_start) 请注意其中的NOT。由于这两个简单的规则找到了所有不匹配的行,因此简单的NOT会将其反转为:如果它不是不匹配的行之一,则必须是匹配的行之一。

    在此处应用简单的逆逻辑来消除NOT,您将得到:

    SELECT * FROM periods WHERE range_start <= @check_period_end AND range_end >= @check_period_start来源:stack overflow

    2020-05-10 20:45:54
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载