【问题标题】:SQL Server - how to dynamically determine financial year?SQL Server - 如何动态确定财政年度?
【发布时间】:2017-05-12 11:08:04
【问题描述】:

每年我都必须更新我公司的财务报告以包括新的财政年度(因为这一年与日历年不同),所以我这样做......

Case
    when ST_date >= '1996.11.01 00:00:00' and st_date  < '1997.11.01 00:00:00' 
    then '96-97'
[etc]
end as year,

每年我都必须记住我需要修改哪些报告 - 大多数年份我都会忘记一个!

...有没有一种简单的动态方法来确定这一点?

【问题讨论】:

    标签: sql-server


    【解决方案1】:

    您绝对可以在 SQL Server 中编写一个简单的存储函数来根据日期确定财政年度:

    CREATE FUNCTION dbo.GetFinancialYear (@input DATETIME)
    RETURNS VARCHAR(20)
    AS BEGIN
        DECLARE @FinYear VARCHAR(20)
    
        SET @FinYear = 
            CASE
                WHEN @INPUT >= '19961101' AND @input < '19971101' THEN '96-97'
                WHEN @INPUT >= '19971101' AND @input < '19981101' THEN '97-98'
                ELSE '(other)'
            END
    
        RETURN @FinYear
    END
    

    然后在所有查询中使用它。

    SELECT 
        somedate, dbo.GetFinancialYear(somedate)
    ......
    

    如果您需要添加新的财政年度 - 只需更新一个函数,就完成了!

    更新:如果您想让这个完全动态,您可以依靠财政年度总是从 11 月开始这一事实1 - 然后改用这种方法:

    CREATE FUNCTION dbo.GetFinancialYear (@input DATETIME)
    RETURNS VARCHAR(20)
    AS BEGIN
        DECLARE @FinYear VARCHAR(20)
    
        DECLARE @YearOfDate INT
    
        IF (MONTH(@input) >= 11)
            SET @YearOfDate = YEAR(@input)  
        ELSE
            SET @YearOfDate = YEAR(@input) - 1
    
        SET @FinYear = RIGHT(CAST(@YearOfDate AS CHAR(4)), 2) + '-' + RIGHT(CAST((@YearOfDate + 1) AS CHAR(4)), 2)
    
        RETURN @FinYear
    END
    

    这将返回:

    • 05/06 表示日期,例如 2005-11-25
    • 04/05 表示日期,例如 2005-07-25

    【讨论】:

    • @dazzathedrummer 如果您发现此答案解决了您的问题,能否将其标记为已接受?
    【解决方案2】:

    看看这个例子:

    declare @ST_Date datetime = '20120506'
    
    SELECT
        convert(char(2),DateAdd(m,-10,@ST_DATE),2)+'-'+
        convert(char(2),DateAdd(m,+ 2,@ST_DATE),2) as year
    

    作为列表达式:

        convert(char(2),DateAdd(m,-10,ST_DATE),2)+'-'+
        convert(char(2),DateAdd(m,+ 2,ST_DATE),2) as year
    

    相当琐碎!

    我处理这些问题(财政年度、支付期等)的方式是认识到财政年度与任何一年都一样,除了它们在 X 个月后开始。因此,直接的解决方案是将 FY 按月数移回日历年,从中进行任何“年度”比较或“年”(或“月”)的推导。

    【讨论】:

      【解决方案3】:
      Declare @FinancialMonth Varchar(100)=NULL,@Month smallint,@Date DateTime='04/06/2013'
      
      BEGIN TRY 
      SELECT @FinancialMonth='01-'+IsNULL(@FinancialMonth,'April')+'-'+Cast(year(getdate()) as varchar)
      SELECT @Month=(Month(Cast(@FinancialMonth as datetime))-1) * -1
      END TRY
      BEGIN CATCH
      SELECT 
              ERROR_NUMBER() AS ErrorNumber,'Invalid Financial Month' ErrorMessage
      END CATCH
      
      SELECT Month((CONVERT([varchar](10),dateadd(month,(@Month),@Date),(101)))) FinancialMonth,
      Year((CONVERT([varchar](10),dateadd(month,(@Month),@Date),(101)))) FinancialYear
      ,DatePart(qq,(CONVERT([varchar](10),dateadd(month,(@Month),@Date),(101)))) FinancialQuarter
      

      【讨论】:

        【解决方案4】:

        这个对我有用,并将其设置为实际的财政年度结束日期。

        SET @enddatefy = convert(DATE, str(datepart(yyyy,DateAdd(m,-6,@enddate))+1)+'0630',112) SET @enddatefyid = str(datepart(yyyy,DateAdd(m,-6,@enddate))+1)+'0630'

        【讨论】:

          【解决方案5】:
          datename(YEAR,  DATEADD(M,-3,Date)) +'-'+ cast((datepart(YEAR,  DATEADD(M,-3,Date)) + 1) %100 as varchar(2))
          

          按“日期”列计算

          财政年度范围为 4 月 1 日至 3 月 31 日

          【讨论】:

            【解决方案6】:
            Create FUNCTION dbo.GetFinancialYear (@input DATETIME)
            RETURNS VARCHAR(20)
            AS BEGIN
                DECLARE @FinYear VARCHAR(20)
            
                IF (MONTH(@input) > 3)
                    SET @FinYear = RIGHT(CAST(Year(@input) AS CHAR(4)), 4) + '-' + RIGHT(CAST((Year(@input) + 1) AS CHAR(4)), 2)
                ELSE
                    SET @FinYear = RIGHT(CAST((Year(@input) - 1) AS CHAR(4)), 4) + '-' + RIGHT(CAST(Year(@input) AS CHAR(4)), 2)
            
                RETURN @FinYear
            END
            

            【讨论】:

              【解决方案7】:
              Declare @date1 datetime = '2017-07-01'
              Select Case 
                  When Month(@date1)>=7 Then 'FY'+Convert(NVARCHAR(10),(Right(year(getdate()),2)+1))
                  Else 'FY'+Convert(NVARCHAR(10),(Right(year(getdate()),2)))
              End
              

              【讨论】:

                【解决方案8】:

                这适用于我,财政年度从 7 月开始。

                CASE WHEN DatePart(mm, [YourDate]) >= 7 
                  THEN convert(varchar(10), YEAR([YourDate])) +' / '+ Convert(varchar(10), YEAR([YourDate]) + 1 )
                  ELSE Convert(varchar(10), YEAR([YourDate]) - 1) +' / '+ Convert(varchar(10), YEAR([YourDate]) )
                  END AS [Financial Year],
                

                【讨论】:

                  猜你喜欢
                  • 2015-07-01
                  • 1970-01-01
                  • 2020-07-23
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2018-12-13
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多