首页 > 解决方案 > SQL:为同一表中具有重叠日期范围的单独记录创建标志

问题描述

我试图弄清楚如何创建一个布尔字段,它会告诉我两条记录何时具有重叠的日期范围。

在以下示例中,指定日期范围内的每个唯一位置/交易对手组合可以有一个合同或一个 DeliveryPoint,而不是两者都有。所以 id 1&2 应该被标记,但是 id 的 3 和 4 是可以的,因为它们不重叠,所以标记应该是“False”。

我开始进行自我加入,但在那之后,我无法理解下一步。我是否开始正确,或者解决方案完全不同?

id  Location    Counterparty    Contract    DeliveryPoint     StartDate   EndDate
1   New York    Wal Mart                     Philadelphia     3/1/2019    12/31/2020
2   New York    Wal Mart        123456                        5/1/2019    7/31/2019
3   Toronto     Target                       Boston           3/1/2019    5/31/2019
4   Toronto     Target          456789                        6/1/2019    12/31/2020

有了旗帜,我希望它看起来像

id  Location    Counterparty    Contract    DeliveryPoint     StartDate  EndDate      Overlap
1   New York    Wal Mart                    Philadelphia      3/1/2019  12/31/2020    TRUE
2   New York    Wal Mart         123456                       5/1/2019  7/31/2019     TRUE
3   Toronto     Target                      Boston            3/1/2019  5/31/2019     FALSE
4   Toronto     Target           456789                       6/1/2019  12/31/2020    FALSE

标签: sqlsql-serverboolean

解决方案


在您的插入查询中,我认为您可以创建一个子查询来搜索具有重叠日期的其他记录。请注意日期字段测试。请参阅示例:

insert into table(location, Counterparty, Overlap)
select
    @location, 
    @Counterparty, 
    case when exists(select Id
               from table t
               where t.location = @location
               and t.Counterparty = @Counterparty 
               and @startDate <= t.EndDate 
               and @endDate >= t.StartDate
              ) then 1 else 0 end as Overlap

推荐阅读