先看看实现的结果,可以by月份和季度,可以调整会计开始日期。
前端略去,只分享ms sql存储过程:
set ansi_nulls on go set quoted_identifier on go -- ============================================= -- author: insus.net -- blog: https://insus.cnblogs.com -- create date: 2019-07-02 -- update date: 2019-07-02 -- description: 动态产生会计周期 -- ============================================= create procedure [dbo].[usp_accountingperiod_select_generateperioddate] ( @fiscal_year smallint, @perioddatetype nvarchar(1), @start1 datetime ) as begin if object_id('#period_date') is not null drop table #period_date create table #period_date( [fiscal_year] [smallint] not null, [start1] [datetime] null, [start2] [datetime] null, [start3] [datetime] null, [start4] [datetime] null, [start5] [datetime] null, [start6] [datetime] null, [start7] [datetime] null, [start8] [datetime] null, [start9] [datetime] null, [start10] [datetime] null, [start11] [datetime] null, [start12] [datetime] null, [start13] [datetime] null, [end1] [datetime] null, [end2] [datetime] null, [end3] [datetime] null, [end4] [datetime] null, [end5] [datetime] null, [end6] [datetime] null, [end7] [datetime] null, [end8] [datetime] null, [end9] [datetime] null, [end10] [datetime] null, [end11] [datetime] null, [end12] [datetime] null, [end13] [datetime] null ) if @fiscal_year >= year([dbo].[svf_lowdate]()) and @fiscal_year < year([dbo].[svf_highdate]()) begin if @start1 is null set @start1 = convert(datetime, convert(nvarchar(4),@fiscal_year) + '-01-01', 121) insert into #period_date ([fiscal_year]) values (@fiscal_year) if @perioddatetype = n'm' begin declare @m tinyint = 1,@ms tinyint = 12 while @m <= @ms begin declare @m_start_field nvarchar(128) = n'[start'+ convert(nvarchar(2), @m) +']' declare @m_start_value datetime = dateadd(m,@m -1,@start1) declare @m_end_field nvarchar(128) = n'[end'+ convert(nvarchar(2), @m) +']' declare @m_end_value datetime = dateadd(day,-1, dateadd(m,@m,@start1)) declare @s_sql nvarchar(4000) = n' update #period_date set '+ @m_start_field +' = '''+ convert(nvarchar(40), @m_start_value ) +''', '+ @m_end_field +' = '''+ convert(nvarchar(40), @m_end_value ) +''' where [fiscal_year] = '''+ convert(nvarchar(4),@fiscal_year) +'''' execute sp_executesql @s_sql set @m = @m + 1 end end if @perioddatetype = n'q' begin declare @q tinyint = 1,@qs tinyint = 4 while @q <= @qs begin declare @q_start_field nvarchar(128) = n'[start'+ convert(nvarchar(2), @q) +']' declare @q_start_value datetime = dateadd(quarter,@q -1,@start1) declare @q_end_field nvarchar(128) = n'[end'+ convert(nvarchar(2), @q) +']' declare @q_end_value datetime = dateadd(day,-1, dateadd(quarter,@q,@start1)) declare @q_s_sql nvarchar(4000) = n' update #period_date set '+ @q_start_field +' = '''+ convert(nvarchar(40), @q_start_value ) +''', '+ @q_end_field +' = '''+ convert(nvarchar(40), @q_end_value ) +''' where [fiscal_year] = '''+ convert(nvarchar(4),@fiscal_year) +'''' execute sp_executesql @q_s_sql set @q = @q + 1 end end end select [fiscal_year], [start1],[start2],[start3],[start4], [start5],[start6],[start7],[start8], [start9],[start10],[start11],[start12], [start13], [end1],[end2],[end3],[end4], [end5],[end6],[end7],[end8], [end9],[end10],[end11],[end12], [end13] from #period_date end