获取具有两个日期列的所有行,其中日期在指定间隔内或之间
Get all Rows with two Date Columns where Dates are in or between an specified intervall
我最近遇到了这个问题,想知道我是否采取了正确的方法。
想想一个 table 有两个带日期的列,一个代表某事的开始,另一个代表某事的结束。
让我们称它们为 VALID_FROM 和 VALID_TO。作为输入,您给它 START 和 END。
在图片中,第一条“线”代表时间线,任何穿过方框的线似乎都是有效数据。
底层线是可能的日期星座,而线的左端始终是 VALID_FROM,右端始终是 VALID_TO。
以 Diamond 结尾的行具有此列的固定日期,如果不是直到无穷大(您可以在此处考虑空值)。
我现在采用的方法是检查六种情况:
- 从无限到无限:
- VALID_FROM = null 和 VALID_TO = null
- 从无限到固定VALID_TO:
- VALID_FROM = null and VALID_TO >= START
- 从固定的VALID_FROM到无限:
- VALID_TO = 空并且 VALID_FROM <= END
- VALID_FROM小于START,所以VALID_TO 必须大于 START:
- VALID_FROM <= START and VALID_TO > 开始
- VALID_TO 大于 END,所以 VALID_FROM 必须小于 END:
- VALID_FROM >= END 和 VALID_TO < 结束
- VALID_FROM 和 VALID_TO 介于 START 和结束
- VALID_FROM >= START and VALID_TO < = 结束
如果您需要任何信息,请告诉我。你觉得我可能的星座完整吗?
如果您有任何想法,请分享您的想法,我会对此感兴趣。
如果我没理解错的话,你可以使用一个简单的过滤器:
select t.*
from t
where valid_to > :start and
valid_from < :end
如果第一个结束在第二个开始之后,并且第一个开始在第二个结束之前,这就是两个时间间隔重叠。
你的术语表明你想要一个真正的重叠,而不是两个刚刚接触的时间段。但是,通过将 <
和 >
更改为 <=
和 >=
.
可以轻松解决这个问题
我最近遇到了这个问题,想知道我是否采取了正确的方法。 想想一个 table 有两个带日期的列,一个代表某事的开始,另一个代表某事的结束。 让我们称它们为 VALID_FROM 和 VALID_TO。作为输入,您给它 START 和 END。 在图片中,第一条“线”代表时间线,任何穿过方框的线似乎都是有效数据。 底层线是可能的日期星座,而线的左端始终是 VALID_FROM,右端始终是 VALID_TO。 以 Diamond 结尾的行具有此列的固定日期,如果不是直到无穷大(您可以在此处考虑空值)。
我现在采用的方法是检查六种情况:
- 从无限到无限:
- VALID_FROM = null 和 VALID_TO = null
- 从无限到固定VALID_TO:
- VALID_FROM = null and VALID_TO >= START
- 从固定的VALID_FROM到无限:
- VALID_TO = 空并且 VALID_FROM <= END
- VALID_FROM小于START,所以VALID_TO 必须大于 START:
- VALID_FROM <= START and VALID_TO > 开始
- VALID_TO 大于 END,所以 VALID_FROM 必须小于 END:
- VALID_FROM >= END 和 VALID_TO < 结束
- VALID_FROM 和 VALID_TO 介于 START 和结束
- VALID_FROM >= START and VALID_TO < = 结束
如果您需要任何信息,请告诉我。你觉得我可能的星座完整吗? 如果您有任何想法,请分享您的想法,我会对此感兴趣。
如果我没理解错的话,你可以使用一个简单的过滤器:
select t.*
from t
where valid_to > :start and
valid_from < :end
如果第一个结束在第二个开始之后,并且第一个开始在第二个结束之前,这就是两个时间间隔重叠。
你的术语表明你想要一个真正的重叠,而不是两个刚刚接触的时间段。但是,通过将 <
和 >
更改为 <=
和 >=
.