我需要提交一份报告,该报告需要我获取会计年度的值。
我遇到的问题是我有开始日期和结束日期。因此,我的理论是根据每个日期之间总是存在一年的假设来生成日期。
Start: 2016-09-02
Finish: 2019-09-02
我需要返回每年的开始日期和结束日期之间的日期,
2016-09-02
2017-09-02
2018-09-02
2019-09-02
我已经考虑过使用递归查询,但是我正在大型数据库上执行此操作,因此需要针对唯一ID定义的不同记录返回以上内容。
例如
UNIQUE ID | Start Date | End Date |
--------------------------------------
LYJX01PC01 | 2016-09-02 | 2019-09-02 |
POMS01PC01 | 2015-10-11 | 2017-10-11 |
我需要输出到
UNIQUE ID | Start Date | End Date | Year Of Account |
--------------------------------------------------------
LYJX01PC01 | 2016-09-02 | 2019-09-02 | 2016-09-02 |
LYJX01PC01 | 2016-09-02 | 2019-09-02 | 2017-09-02 |
LYJX01PC01 | 2016-09-02 | 2019-09-02 | 2018-09-02 |
LYJX01PC01 | 2016-09-02 | 2019-09-02 | 2019-09-02 |
POMS01PC01 | 2015-10-11 | 2017-10-11 | 2015-10-11 |
POMS01PC01 | 2015-10-11 | 2017-10-11 | 2016-10-11 |
POMS01PC01 | 2015-10-11 | 2017-10-11 | 2017-10-11 |
然后我可以在加入时使用“帐户年限”。
答案 0 :(得分:1)
在SQL Server中,可以使用递归CTE。看起来像:
break
注意:如果您可以将100年或更长的时间用于唯一ID,则需要添加:
print
查询结束。
答案 1 :(得分:1)
另一种选择是与CROSS APPLY配合使用的临时统计表
示例
Select A.*
,[Year of Account] = B.D
From YourTable A
Cross Apply (
Select Top (DateDiff(YEAR,[Start Date],[End Date])+1)
D=DateAdd(YEAR,-1+Row_Number() Over (Order By (Select Null)),[Start Date])
From master..spt_values n1
) B
返回
UNIQUE ID Start Date End Date Year of Account
LYJX01PC01 2016-09-02 2019-09-02 2016-09-02
LYJX01PC01 2016-09-02 2019-09-02 2017-09-02
LYJX01PC01 2016-09-02 2019-09-02 2018-09-02
LYJX01PC01 2016-09-02 2019-09-02 2019-09-02
POMS01PC01 2015-10-11 2017-10-11 2015-10-11
POMS01PC01 2015-10-11 2017-10-11 2016-10-11
POMS01PC01 2015-10-11 2017-10-11 2017-10-11