【问题标题】:Get all Rows with two Date Columns where Dates are in or between an specified intervall获取具有两个日期列的所有行,其中日期在指定间隔内或之间
【发布时间】:2020-11-14 07:44:55
【问题描述】:

我最近遇到了这个问题,想知道我是否采取了正确的方法。 想象一张有两列日期的表格,一列代表某事的开始,另一列代表某事的结束。 我们称它们为 VALID_FROMVALID_TO。作为输入你给它STARTEND。 在图片中,第一条“线”代表时间线,任何穿过框的线似乎都是有效数据。 底层线是可能的日期星座,而线的左端始终是 VALID_FROM,而右端始终是 VALID_TO。 以菱形结尾的行有一个固定的日期,如果不是直到无穷大(你可以在这里认为一个空值)。

我现在采取的方法是检查六个案例:

  1. 从无穷到无穷:
  • VALID_FROM = null 和 VALID_TO = null
  1. 从无穷大到固定VALID_TO
  • VALID_FROM = null 且 VALID_TO >= START
  1. 从固定 VALID_FROM 到无穷大:
  • VALID_TO = null 和 VALID_FROM END
  1. VALID_FROM 小于 START,因此 VALID_TO 必须大于 START
  • VALID_FROM START 和 VALID_TO > START
  1. VALID_TO 大于 END,因此 VALID_FROM 必须小于 END
  • VALID_FROM >= ENDVALID_TO END
  1. VALID_FROMVALID_TO 介于 STARTEND 之间
  • VALID_FROM >= STARTVALID_TO END

如果您需要任何信息,请告诉我。你认为我可能的星座是完整的吗? 如果您有任何想法,请分享您的想法,我会对它感兴趣。

【问题讨论】:

  • 用您正在使用的数据库标记您的问题。示例数据和期望的结果作为文本表将是一个很大的帮助 - 一个 db/sql 小提琴是值得赞赏的。

标签: sql date time intervals


【解决方案1】:

如果我理解正确,您可以使用一个简单的过滤器:

select t.*
from t
where valid_to > :start and
      valid_from < :end

如果第一个结束第二个开始,而第一个开始第二个结束,则两个时间间隔重叠。

您的术语表明您想要一个实际的重叠,而不是两个刚刚接触的时间段。但是,这很容易通过将&lt;&gt; 更改为&lt;=&gt;= 来处理。

【讨论】:

    猜你喜欢
    • 2013-08-09
    • 2022-01-04
    • 2020-05-12
    • 1970-01-01
    • 2017-06-12
    • 1970-01-01
    • 2014-06-11
    • 1970-01-01
    • 2013-10-07
    相关资源
    最近更新 更多