假设我在表格中有这些值
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。
答案 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个月或结束日期。