2

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

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,

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

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

4

8 回答 8

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
于 2012-10-10T08:48:37.040 回答
3

看看这个例子:

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 按月数移回日历年,从中进行任何“年度”比较或“年”(或“月”)的推导。

于 2012-10-10T09:10:42.437 回答
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
于 2013-10-10T10:01:00.580 回答
0

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

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'

于 2014-07-01T01:25:09.300 回答
0
datename(YEAR,  DATEADD(M,-3,Date)) +'-'+ cast((datepart(YEAR,  DATEADD(M,-3,Date)) + 1) %100 as varchar(2))

计算列“日期”

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

于 2017-01-28T06:46:54.300 回答
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
于 2017-02-24T07:08:19.700 回答
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
于 2017-05-12T00:39:46.933 回答
-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],
于 2014-03-26T01:19:18.530 回答