SQL Server - 如何动态确定财务年度?

时间:2012-10-10 08:42:16

标签: sql-server

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

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,

每年我都要记住我需要修改哪些报告 - 大多数时候我忘记了一个报告!

......有一种简单的动态方法可以确定吗?

8 个答案:

答案 0 :(得分:6)

您绝对可以在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
  • 等日期

答案 1 :(得分: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个月后开始。因此,直接的解决方案是将财政年度转移回日历年,从中进行任何“年度”比较或推算“年”(或“月”)。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

这个适用于我并将其设置为实际的FY结束日期。

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'

答案 4 :(得分:0)

datename(YEAR,  DATEADD(M,-3,Date)) +'-'+ cast((datepart(YEAR,  DATEADD(M,-3,Date)) + 1) %100 as varchar(2))

计算列&#39;日期&#39;

财政年度范围从4月1日到3月31日

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

答案 7 :(得分:-1)

这适用于我,即财政年度从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],