Sql 在两个表中查找重叠日期范围的实例

Sql 在两个表中查找重叠日期范围的实例,sql,ruby-on-rails,ruby,postgresql,date,Sql,Ruby On Rails,Ruby,Postgresql,Date,我想检查集合中的任何给定日期范围是否与从db检索到的范围重叠。希望我能在一个查询中执行它 正如PostgreSQL文档中所解释的,OVERLAPS方法的使用方式如下: SELECT ('2001-02-16', '2001-12-21') OVERLAPS ('2001-10-30', '2002-10-30'); Result: true 是否有可能提供日期范围集合的重叠?比如: SELECT ('2001-02-16', '2001-12-31'), ('2002-01-01

我想检查集合中的任何给定日期范围是否与从db检索到的范围重叠。希望我能在一个查询中执行它

正如PostgreSQL文档中所解释的,
OVERLAPS
方法的使用方式如下:

SELECT ('2001-02-16', '2001-12-21') OVERLAPS
       ('2001-10-30', '2002-10-30');
Result: true
是否有可能提供日期范围集合的
重叠
?比如:

SELECT ('2001-02-16', '2001-12-31'), ('2002-01-01', 2002-12-31), (...) OVERLAPS
       ('2001-10-30', '2002-10-30'), (...);
Result: true
您可以使用收集所需的所有时间间隔,然后将
重叠
功能与此数据触发到给定的时间间隔,例如

WITH j(start_date,end_date) AS ( 
  VALUES ('2001-02-16'::DATE, '2001-12-21'::DATE),
         ('2002-01-01'::DATE, '2002-12-31'::DATE),
         ('2019-01-01'::DATE, '2020-01-01'::DATE))
SELECT (start_date,end_date) OVERLAPS ('2001-10-30'::DATE, '2002-10-30'::DATE)
FROM j;

 overlaps 
----------
 t
 t
 f
(3 Zeilen)
您可以使用收集所需的所有时间间隔,然后将
重叠
功能与此数据触发到给定的时间间隔,例如

WITH j(start_date,end_date) AS ( 
  VALUES ('2001-02-16'::DATE, '2001-12-21'::DATE),
         ('2002-01-01'::DATE, '2002-12-31'::DATE),
         ('2019-01-01'::DATE, '2020-01-01'::DATE))
SELECT (start_date,end_date) OVERLAPS ('2001-10-30'::DATE, '2002-10-30'::DATE)
FROM j;

 overlaps 
----------
 t
 t
 f
(3 Zeilen)

我想我可能有部分答案。假设我有表
t1

 starts_at  |  ends_at   
------------+------------
 2001-01-01 | 2001-01-02
 2001-01-05 | 2001-01-06
 2001-01-08 | 2001-01-09
我想检查一下
t1
和某些给定的日期范围之间是否存在重叠的日期。到目前为止,我已经成功地解决了它,没有出现重叠:

WITH t2(starts_at, ends_at) AS(
  VALUES('2001-01-01'::DATE, '2001-01-05'::DATE),
        ('2001-01-12'::DATE, '2001-01-15'::DATE))
SELECT * 
FROM t1, t2
WHERE 
   t1.starts_at < t2.ends_at AND t1.ends_at >= t2.starts_at;

然后,如果存在任何行,我想在我的应用程序中抛出一个异常。这是正确的方法吗?

我想我可能有部分答案。假设我有表
t1

 starts_at  |  ends_at   
------------+------------
 2001-01-01 | 2001-01-02
 2001-01-05 | 2001-01-06
 2001-01-08 | 2001-01-09
我想检查一下
t1
和某些给定的日期范围之间是否存在重叠的日期。到目前为止,我已经成功地解决了它,没有出现重叠:

WITH t2(starts_at, ends_at) AS(
  VALUES('2001-01-01'::DATE, '2001-01-05'::DATE),
        ('2001-01-12'::DATE, '2001-01-15'::DATE))
SELECT * 
FROM t1, t2
WHERE 
   t1.starts_at < t2.ends_at AND t1.ends_at >= t2.starts_at;

然后,如果存在任何行,我想在我的应用程序中抛出一个异常。这是正确的方法吗?

有没有办法在两张表上使用重叠?我尝试将select语句放在重叠的
之后,但没有效果。两个表都包含开始日期和结束日期吗?您可以添加一个示例吗?很抱歉没有足够的说明,但可以,两个表都有开始和结束日期。我在下面的评论中提供了更多的细节。考虑关闭这个问题,以便其他人能够更容易地找到它。在两个表上有没有办法使用<代码>重叠< /代码>?我尝试将select语句放在重叠的
之后,但没有效果。两个表都包含开始日期和结束日期吗?您可以添加一个示例吗?很抱歉没有足够的说明,但可以,两个表都有开始和结束日期。我在下面的评论中提供了更多的细节。考虑关闭这个问题,以便其他人可以更容易地找到它。<代码>重叠像许多PARGRESS函数一样,是一个更大表达式的捷径,所以用其他东西代替它是很好的。您的查询看起来很好+1:)
重叠
就像许多postgres函数是一个更大表达式的快捷方式一样,因此可以用其他函数替换它。您的查询看起来很好+1:)