我正在尝试在记录中记录两个日期,并将它们分成定义的年份段。这些乐队/水桶都是一年。我已经有一段时间了,但我似乎无法在第二年获得起点!
一些测试数据:
IF OBJECT_ID('tempdb..##PolicyUWYear') IS NOT NULL
BEGIN
DROP TABLE ##PolicyUWYear
END
CREATE TABLE ##PolicyUWYear
(
PolicyNumber [nvarchar](50)
,PolicyStartDate datetime
,PolicyEndDate datetime
)
ON [PRIMARY]
Insert into ##PolicyUWYear Values ('RMO33032207' , '2014-03-04 00:00:00.000','2017-03-04 00:00:00.000' )
Insert into ##PolicyUWYear Values ('RMO33000999' , '2013-10-04 00:00:00.000','2016-10-04 00:00:00.000' )
Insert into ##PolicyUWYear Values ('AMO05000888' , '2014-09-04 00:00:00.000','2014-12-04 00:00:00.000' )
Insert into ##PolicyUWYear Values ('QQO05000333' , '2014-10-04 00:00:00.000','2015-10-04 00:00:00.000' )
这会创建一个如下所示的表:
我想要的是拆分成定义的桶..如下所示(不完整使用所有测试数据):
这让一些事情感到困惑..最大的问题是每个承保年度从10月10日开始到9月30日结束 - 这意味着记录可以从2014年8月开始,但仍然是2013年承保年度的一部分。
例如' 2013年至2014年UnderwritingYear Start'是2013-10-01和 2013年至2014年UnderwritingYear End是2014-09-30。
记录可以是各种长度...大多数是3或5年..但有些可以更短!基本上,它的财务,所以客户有奇怪和想法...
感谢任何帮助 - 我开始认为这很简单,并且发现它不是。说完可能就是这样!答案 0 :(得分:1)
这里的逻辑很麻烦,但你可以做到。它需要大量的条件聚合。我认为以下内容包含了逻辑:
select PolicyNumber,
max(case when PolicyEndDate <= '2013-09-30' then NULL
when PolicyStartDate <= '2014-09-30'
then dateadd(year,
datediff(month, PolicyStartDate, '2014-09-30') / 12,
PolicyStartDate
)
end) as UW_start_2013,
max(case when PolicyStartDate > '2014-09-30' then NULL
when PolicyEndDate > '2013-09-30' and PolicyEndDate <= '2014-09-30'
then PolicyEndDate
when PolicyEndDate > '2014-09-30'
then dateadd(year,
1 + (datediff(month, PolicyStartDate, '2014-09-30') / 12),
PolicyStartDate
)
end) as UW_end_2013,
max(case when PolicyEndDate <= '2013-09-30' then NULL
when PolicyStartDate <= '2015-09-30'
then dateadd(year,
datediff(month, PolicyStartDate, '2015-09-30') / 12,
PolicyStartDate
)
end) as UW_start_2014,
max(case when PolicyStartDate > '2015-09-30' then NULL
when PolicyEndDate > '2014-09-30' and PolicyEndDate <= '2015-09-30'
then PolicyEndDate
when PolicyEndDate > '2015-09-30'
then dateadd(year,
1 + (datediff(month, PolicyStartDate, '2015-09-30') / 12),
PolicyStartDate
)
end) as UW_end_2014
from PolicyUWYear
group by PolicyNumber;
Here是一个SQL小提琴。