【问题标题】:Get consecutive date ranges from overlapping date ranges从重叠的日期范围中获取连续的日期范围
【发布时间】:2015-11-11 14:51:39
【问题描述】:

我一直在尝试各种事情,但我无法弄清楚。我在搜索中没有发现相同的问题。

我有一个包含多个日期范围的表格,我需要获取连续且不重叠的表格。例如:

表:

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 的。

【问题讨论】:

  • 包含您的原始表并包含您当前的查询。
  • 我不明白你为什么不能使用 enddate+1 = start date。你能再解释一下吗?
  • 2012-12-31 + 1 = 2013-01-01,因此不会排除结束日期为 2013-12-31 的行。
  • 连续日期的月/日是否总是相同的?
  • 这张表有ID吗?

标签: sql sql-server tsql


【解决方案1】:

根据您的陈述, “由于最近的是 7/1 - 6/30,我不希望结果中有任何 1/1 - 12/31 范围。”

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

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

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

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)

【讨论】:

  • 这是个好主意。不幸的是,我有一些日期范围,例如 2011-12-27 - 2012-12-31,这与结果混淆了。
猜你喜欢
  • 1970-01-01
  • 2013-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多