每年在2个日期之间获取日期SQL

时间:2018-09-20 11:04:08

标签: sql sql-server

我需要提交一份报告,该报告需要我获取会计年度的值。

我遇到的问题是我有开始日期和结束日期。因此,我的理论是根据每个日期之间总是存在一年的假设来生成日期。

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   |

然后我可以在加入时使用“帐户年限”。

2 个答案:

答案 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