- 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