2015-11-11 276 views
0

我一直在尝试各种各样的事情,我无法弄清楚这一点。我在搜索中没有看到相同的问题。从重叠的日期范围获取连续的日期范围

我有一个表有多个日期范围,我需要得到那些连续的,不重叠的。例如:

表:

Company | StartDate | EndDate 
--------------------------------- 
A  | 2014-07-01 | 2015-06-30 
A  | 2013-07-01 | 2014-06-30 
A  | 2013-01-01 | 2013-12-31 
A  | 2012-07-01 | 2013-06-30 
A  | 2012-01-01 | 2012-12-31 

所需的结果:

Company | StartDate | EndDate 
--------------------------------- 
A  | 2014-07-01 | 2015-06-30 
A  | 2013-07-01 | 2014-06-30 
A  | 2012-07-01 | 2013-06-30 

我们基本上有财年和日历年在这里。我希望我的结果集基于最新的一组日期。由于最近的是7/1 - 6/30,我不想在结果中有1/1 - 12/31的范围。我不能像WHERE MONTH(EndDate)=6那样硬编码,因为在现实生活中,财年的开始和结束可能会有很大的不同。我不能这样做EndDate + 1 = StartDate,因为旧的日历年将使新的日历年适合该集。

我对此数据库的访问权限有限,所以我无法写入SP或临时表。这是针对SQL Server 2008的。

+0

包括您的原始表并包括您当前的查询。 –

+0

我不明白为什么你不能使用enddate + 1 =开始日期。你能再解释一遍吗? –

+0

2012-12-31 + 1 = 2013-01-01,因此2013-12-31结束日期的行不会被排除。 – JMcD

回答

0

根据你的说法, “由于最近的是7/1 - 6/30,我不希望结果中有1/1 - 12/31范围。 “

我认为这是你想要的结果。

SELECT MAX(StartDate) AS MostRecentStartDate 
     ,MAX(EndDate) AS MostRecentEndDate 
FROM myTable 

将此用作您的内部查询并与您的表连接。只有与Month匹配的StartDateMonthEndDate才会返回。

SELECT * FROM myTable AS tb 
INNER JOIN 
    (SELECT MAX(StartDate) AS MostRecentStartDate 
      ,MAX(EndDate) AS MostRecentEndDate 
    FROM myTable 
    ) AS src 
ON MONTH(tb.StartDate) = MONTH(src.MostRecentStartDate) 
AND MONTH(tb.EndDate) = MONTH(src.MostRecentEndDate) 
+0

这是一个非常好的想法。不幸的是,我有几个日期范围,例如“2011-12-27 - 2012-12-31”,这与结果混淆。 – JMcD