当前位置: 首页 > 面试题库 >

比较日期范围

汪博达
2023-03-14
问题内容

在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

问题答案:

这是一个经典问题,如果您逆转逻辑,实际上会更容易。

让我举一个例子。

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

           |-------------------|          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


 类似资料:
  • 所以今年早些时候,我在大学里接到了一个任务。任务是使用OOP程序创建一个停车场管理系统。例如,我们学习了如何使用继承、抽象类和实例。我已经完成了并通过了这个作业,所以这个问题只是为了知识目的。其中一个任务是按时间顺序对对象的 Array 列表进行排序。为此,我们学习了可比/比较器方法。但是,我无法理解它,也无法做到这一点。问题是,我们必须对数组列表中的“Vehicle”对象中的“DateTime”

  • 目前,我正努力争取与之相比的约会。更重要的是,我有一个属性Death的人,格式是YYYY-MM-DD,如果这个人已经死了(Death 我尝试了以下做法: 但我只收到来自浏览器的解析错误。我使用的是XSL1.0版,除了xmlns:XSL=“http://www.w3.org/1999/XSL/transform”之外,没有任何名称空间。

  • 我有一个rails生成的日期和一个jQuery生成的日期。 导轨日期打印如下: jQuery日期打印如下: 我想检查jQuery日期是大于还是小于rails日期。但是不管日期如何,jQuery日期总是被解释为比rails日期大。 为什么会这样,我怎样才能成功地比较这两个日期? 更新: 事实上,我刚刚发现问题在于它只允许1969年之前的日期。我打算代码只允许18岁以上的日期。有人知道为什么不同吗?

  • 问题内容: 请有人帮忙…为什么查询不起作用.. ?? 问题答案: 在Oracle中,一个总有一个时间成分。您的客户端可能显示也可能不显示时间分量,但是当您尝试进行相等比较时,它仍然存在。您还总是希望将日期与日期而不是字符串进行比较,后者使用当前会话进行隐式转换,从而使它们相当脆弱。THat将涉及ANSI日期文字或显式调用 您可以使用该函数将截断到午夜 或者,您可以进行范围比较(如果您可以受益于的索

  • 用于排序的日期比较不起作用。请指教。 我的代码: 错误: 错误:找不到返回d1的符号。与(d2)比较 符号:方法比较到(日期) 位置:日期类型的变量d1 注意:某些输入文件使用或重写了不推荐的API 注意:使用-Xlint:deprecation重新编译以获取详细信息 注意:某些输入文件使用未检查或不安全的操作 注意:使用-Xlint重新编译:未选中以获取详细信息。

  • 问题 如果你想知道某个变量是否在给定的范围内。 解决方案 使用 CoffeeScript 的连缀比较语法。 maxDwarfism = 147 minAcromegaly = 213 height = 180 normalHeight = maxDwarfism < height < minAcromegaly # => true 讨论 这是从 Python 中借鉴过来的一个很棒的特性。利用这