sqlserver 2005将日期范围拆分为连续几年

时间:2014-06-27 14:28:30

标签: sql sql-server sql-server-2005

我正在尝试在记录中记录两个日期,并将它们分成定义的年份段。这些乐队/水桶都是一年。我已经有一段时间了,但我似乎无法在第二年获得起点!

一些测试数据:

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'  ) 

这会创建一个如下所示的表:

enter image description here

我想要的是拆分成定义的桶..如下所示(不完整使用所有测试数据):

enter image description here

这让一些事情感到困惑..最大的问题是每个承保年度从10月10日开始到9月30日结束 - 这意味着记录可以从2014年8月开始,但仍然是2013年承保年度的一部分。

例如' 2013年至2014年UnderwritingYear Start'是2013-10-01和 2013年至2014年UnderwritingYear End是2014-09-30。

记录可以是各种长度...大多数是3或5年..但有些可以更短!基本上,它的财务,所以客户有奇怪和想法...

感谢任何帮助 - 我开始认为这很简单,并且发现它不是。说完可能就是这样!

1 个答案:

答案 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小提琴。