基于开始结束日期SQL Server拆分行

时间:2015-04-06 17:30:41

标签: sql-server sql-server-2008-r2

假设我在表格中有这些值

Package | Start Date | End date 
---------------------------------
PKG123  | 01-02-2013 | 31-01-2016
PKG456  | 15-06-2010 | 14-06-2014

我想编写一个select语句,它应该给我一些结果:

Package | Start Date | End date
-----------------------------------
PKG123  | 01-02-2013 | 31-01-2014
PKG123  | 01-02-2014 | 31-01-2015
PKG123  | 01-02-2015 | 31-01-2016
PKG456  | 15-06-2010 | 14-06-2011
PKG456  | 15-06-2011 | 14-06-2012
PKG456  | 15-06-2012 | 14-06-2013
PKG456  | 15-06-2013 | 14-06-2014

有没有办法在TSQL中执行此操作?

请注意,我不是要查找两个日期之间的完整日期列表,而是根据12个月的持续时间查找将一行拆分为多行。

我使用的是SQL Server 2008 R2。

1 个答案:

答案 0 :(得分:2)

这是使用递归CTE的方法:

;with CTE as (
  select package, startDate, EndDate from data
  union all
  select package, dateadd(month, 12, startDate), EndDate
  from CTE where EndDate > dateadd(month, 12, startDate)
)

select 
  package,
  startdate,
  case when enddate <= dateadd(month, 12, startdate)
    then enddate else dateadd(day, -1, dateadd(month, 12, startdate)) end
    as enddate
From
  CTE 
order by package, startdate

CTE将从表中获取行,如果startdate + 12个月小于结束日期,则递归选择新行。 CTE外部的选择将确定要使用的行中的哪个值,startdate + 12个月或结束日期。

SQL小提琴:http://sqlfiddle.com/#!6/5bfbf/4