【问题标题】:calculate fiscal year in sql select statement?在sql select语句中计算会计年度?
【发布时间】:2021-09-02 11:53:58
【问题描述】:

我有一个需要以财政年度格式返回的日期字段。例子

Start_Date        Year 
04/01/2012 -      2013
01/01/2012 -      2012
09/15/2013 -      2014

我们需要计算

04/01/2012 to 03/31/2013 is FY 2013

04/01/2013 to 03/31/2014 is FY 2014

我们如何在 select 语句中做到这一点?

【问题讨论】:

  • 所以你需要结束日期?
  • 您的输入数据是否与上述示例中的输出一致?我认为输入错误。

标签: sql sql-server tsql


【解决方案1】:

大卫有一个很好的解决方案。更简单的表达方式是:

select year(dateadd(month, -3, start_date)) as FiscalYear

即减去3个月,取年。

编辑:

正如评论中所指出的,这似乎为时过早一年。这里有两个解决方案:

select year(dateadd(month, 9, start_date)) as FiscalYear

select 1 + year(dateadd(month, -3, start_date)) as FiscalYear

【讨论】:

  • 我认为这比 CASE-WHEN-THEN-ELSE 更简单,但在这个特定示例中,您要添加 9 个月。如果再加上 9 个月,4 月将上升到明年的 1 月。
【解决方案2】:
SELECT CASE WHEN DatePart(Month, Start_Date) >= 4
            THEN DatePart(Year, Start_Date) + 1
            ELSE DatePart(Year, Start_Date)
       END AS Fiscal_Year
FROM data

【讨论】:

  • 有点代码高尔夫球,但如果你让你的第一个组
【解决方案3】:

我只是选择这样做。这很容易,您可以用您想要的财年结束时的任何内容替换 09,30。不确定这是否适用于除 SQL Server 之外的任何东西。

CASE 
    WHEN CAST(GETDATE() AS DATE) > 
         SMALLDATETIMEFROMPARTS(DATEPART(YEAR,GETDATE()),09,30,00,000) 
    THEN 
        DATEPART(YEAR,GETDATE()) + 1 ELSE DATEPART(YEAR,GETDATE()) 
    END AS FY

【讨论】:

    【解决方案4】:

    假设您有一个表 Fiscal_Year,其中 Start_Date 为每年,并且您想查找给定日期 @Date 的会计年度:

    SELECT MIN(Year) WHERE @Date >= Start_Date FROM Fiscal_Year
    

    【讨论】:

      【解决方案5】:
      Declare @t table(StartDate date ,Year1 int)
      insert into @t values('04/01/2012',2013),('01/01/2012',2012),('09/15/2013',2014)
      ;with CTE as
      (select max(year1) maxyear from @t)
      , cte1 as
       (select cast('04/01/'+convert(varchar(4),a.year1) as  date) FromFY,dateadd(day,-1,dateadd(year,1,cast('04/01/'+convert(varchar(4),a.year1) as date))) ToFY
      
      
      ,b.year1 from @t a  inner join (select min(year1)year1 from @t) b on a.year1=b.year1
          union all
         select cast(dateadd(day,1,ToFY) as date),cast(dateadd(year,1,ToFY) as date),year1+1 year1 from     cte1 where year1<=(select maxyear from cte)
      )
      
      select * from cte1
      

      【讨论】:

        【解决方案6】:
        DECLARE @STARTDATE DATETIME, @ENDDATE DATETIME,@CURR_DATE DATETIME
        SET @CURR_DATE='2015-01-30'
        IF MONTH(@CURR_DATE) IN (1,2,3)
        BEGIN
            SET @STARTDATE= CAST( CAST(YEAR(@CURR_DATE)-1 AS VARCHAR)+'/04/01'  AS DATE)
            SET @ENDDATE= CAST( CAST(YEAR(@CURR_DATE)  AS VARCHAR)+'/03/31'  AS DATE)
        END
        ELSE
        BEGIN
            SET @STARTDATE= CAST( CAST(YEAR(@CURR_DATE) AS VARCHAR)+'/04/01'  AS DATE)
            SET @ENDDATE= CAST( CAST(YEAR(@CURR_DATE)+1 AS VARCHAR)+'/03/31'  AS DATE)
        END
        SELECT @STARTDATE AS ST_FI,@ENDDATE AS END_FY
        

        【讨论】:

          【解决方案7】:

          ...简单的事情:)

          (YEAR(DATEADD(Month,-((DATEPART(Month,[Date])+5) %12),[Date]))+) AS Financial_Year

          【讨论】:

          • 因为-((DATEPART(Month,[Date])+5) %12) 将产生 0 对于月份小于 7 的任何 [Date],而对于所有其他月份产生 -1,这个函数看起来应该返回当前日期的年份,或者如果日期在下半年,则提前一个月。哪个总是会返回与YEAR([Date]) 相同的东西 假设最后的'+)' 只是一个错字......你的意思是(YEAR(DATEADD(Year,((DATEPART(Month,[Date])+5) %12),[Date])) - 如果提前五个月在十二月或之后添加一年?值得注意的是,这个问题也在寻找从 4 月开始的 FY...
          【解决方案8】:
          declare @Date smalldatetime, @FiscalYearStartMonth tinyint
          set @Date = GETDATE();
          set @FiscalYearStartMonth = 1; -- Jan
          
          print convert(varchar(4), 
          case when MONTH(@Date) < @FiscalYearStartMonth 
          then YEAR(@Date) -1 
          else YEAR(@Date) end)
          

          假设 @Date 是您的 [Start_Date] 字段,您可以:

          select * from yourTable 
          group by convert(varchar(4), 
          case when MONTH([Start_Date]) < @FiscalYearStartMonth 
          then YEAR([Start_Date]) -1 
          else YEAR([Start_Date]) end)
          

          希望对你有帮助

          【讨论】:

            【解决方案9】:

            这是在 oracle 中获取当前财政年度的样子。输入您要查找会计年度的日期来代替 sysdate

             SELECT '01-APR-'
             ||TO_CHAR((add_months(**sysdate**,-3)),'YYYY') FIN_YEAR_START_DATE,
             '31-MAR-'
             ||(TO_CHAR((add_months(**sysdate**,-3)),'YYYY')+1) FIN_YEAR_END_DATE
             FROM dual;
            

            【讨论】:

              【解决方案10】:

              对于仅年份格式(2020 财年),请使用以下查询:

              SELECT tender_opening_date,CASE WHEN MONTH( order_date) >= 4
                          THEN CONCAT('FY ',YEAR(( order_date)) +1  )
                          ELSE CONCAT('FY ',YEAR( order_date)-1   )
                     END AS Fiscal_Year
              FROM orders_tbl
              

              对于整个财政年度(2019-20 财年),请使用以下查询:

              SELECT tender_opening_date,CASE WHEN MONTH( order_date) >= 4
                              THEN CONCAT('FY ',YEAR( order_date),'-',DATE_FORMAT( order_date,'%y') +1  )
                              ELSE CONCAT('FY ',YEAR( order_date)-1,'-',DATE_FORMAT( order_date,'%y')   )
                         END AS Fiscal_Year
                  FROM orders_tbl
              

              【讨论】:

                【解决方案11】:

                对于澳大利亚财政年度,请使用以下内容:

                SELECT
                    year(dateadd(MONTH, 6, DateColumn)) AS FY,
                    ...
                FROM ...
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2013-04-25
                  • 2020-10-15
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2022-01-24
                  • 2020-09-26
                  相关资源
                  最近更新 更多