16

您将如何根据 SQL Server 视图中的日期字段计算会计年度?

4

19 回答 19

25

我建议您根据应用程序的会计年度使用用户定义函数。

CREATE FUNCTION dbo.fnc_FiscalYear(
    @AsOf           DATETIME
)
RETURNS INT
AS
BEGIN

    DECLARE @Answer     INT

    -- You define what you want here (September being your changeover month)
    IF ( MONTH(@AsOf) < 9 )
        SET @Answer = YEAR(@AsOf) - 1
    ELSE
        SET @Answer = YEAR(@AsOf)


    RETURN @Answer

END



GO

像这样使用它:

SELECT dbo.fnc_FiscalYear('9/1/2009')


SELECT dbo.fnc_FiscalYear('8/31/2009')
于 2009-11-20T17:24:54.623 回答
14
CASE WHEN MONTH(@Date) > 10 THEN YEAR(@Date) + 1 ELSE YEAR(@Date) END
于 2009-11-20T17:24:39.830 回答
12

这是澳大利亚财政年度开始日期代码

 select DATEADD(dd,0, DATEDIFF(dd,0, DATEADD( mm,
 -(((12 + DATEPART(m, getDate())) - 7)%12), getDate() ) 
 - datePart(d,DATEADD( mm, -(((12 + DATEPART(m, getDate())) - 7)%12),getDate() ))+1 ) )

它返回像'2012-07-01 00:00:00.000'

于 2012-07-31T08:10:06.840 回答
8
CASE 
  WHEN MONTH(Date) > 6 
   THEN YEAR(Date) + 1
   ELSE YEAR(Date)
  END AS [FISCAL YEAR]

在这种情况下,会计年度从 7 月 1 日开始。这是最简单的解决方案。

于 2012-02-09T18:28:10.353 回答
2

这种情况下最简单的表达式: YEAR(DATEADD(month, 3, Date))

联邦财政年度

财政年度是联邦政府的会计期间。它从 10 月 1 日开始,到下一个日历年的 9 月 30 日结束。每个会计年度由其结束的日历年标识,通常称为“FY”。例如,2003 财年从 2002 年 10 月 1 日开始,到 2003 年 9 月 30 日结束……其目的是为国会提供更多时间来处理拨款立法,特别是避免继续通过决议。

这可能不适用于美国以外的其他国家和地区,但您只需根据需要更换数字 3。

于 2014-01-22T22:02:27.950 回答
2

我已经扩展了 ChrisF 和 Conficker 发布的答案。

DECLARE @FFYStartMonth INT = 10 --The first month of the FFY
DECLARE @EntryDate DATETIME = '4/1/2015' --The date of the data
DECLARE @StartDate DATETIME

DECLARE @EndDate DATETIME

SET @StartDate = DATEADD(dd, 0,
    DATEDIFF(dd, 0,
        DATEADD(mm, - (((12 + DATEPART(m, @EntryDate)) - @FFYStartMonth)%12), @EntryDate) -
datePart(d,DATEADD(mm, - (((12 + DATEPART(m, @EntryDate)) - @FFYStartMonth )%12),
    @EntryDate )) + 1 ))  

SET @EndDate = DATEADD(SS, -1, DATEADD(mm, 12, @StartDate))

SELECT @StartDate, @EndDate
于 2015-11-20T15:39:49.760 回答
1

我不认为你可以,因为没有通用的财政日历。企业和国家/地区的财政年度各不相同。

附录:您需要做的是有一个单独的数据库表,其中包含财政开始日期和每个适用年份的财政结束日期。使用该表中的数据计算给定特定日期的会计年度。

于 2009-11-20T17:22:16.737 回答
1

您需要多个字段来执行此操作...

您应该检查您对会计年度的定义,因为它因公司而异

于 2009-11-20T17:23:52.223 回答
1

给定@FiscalYearStartMonth是您的会计年度开始月份(数字)并且@Date是相关日期,请执行以下操作:

SELECT 
  CASE 
      WHEN @FiscalYearStartMonth = 1 OR @FiscalYearStartMonth > MONTH(@Date) 
      THEN YEAR(@Date) 
      ELSE YEAR(@Date) + 1 
  END AS FiscalYear

您可以在函数中将其抽象化,或用作派生视图中的列

于 2012-05-09T18:57:06.363 回答
1

我刚刚意识到 Brett Veenstra 的标记答案是错误的。FY不应该这样计算吗?:

CREATE FUNCTION dbo.fnc_FiscalYear(
    @AsOf           DATETIME
)
RETURNS INT
AS
BEGIN
    DECLARE @Answer     INT
    IF ( MONTH(@AsOf) < 9 )
        SET @Answer = YEAR(@AsOf) 
    ELSE
        SET @Answer = YEAR(@AsOf) + 1
    RETURN @Answer
END;
于 2014-08-27T23:06:31.113 回答
1

以@csaba-toth 的上述答案为基础,并假设您的财政年度从每月的第一天开始

year(dateadd(month, (12 -FyStartMonth + 1), <date>)

我的财政年度从第 7 个月开始,即 7 月 1 日,所以我的常数是 (12 - 7 + 1 =) 6。

测试用例(截至 2019 年 9 月 25 日):

select year(dateadd(month, 6, getdate()))
, year(dateadd(month,6, '1/1/2020'))
, year(dateadd(month, 6, '7/1/2020'))
, year(dateadd(month, 6, '6/30/2020'))

回报:

2020    2020    2021    2020

我相信这是最简单,也许是最容易理解的实现。

于 2019-09-25T17:38:14.547 回答
1
DECLARE @DateFieldName DATETIME = '1/1/2020'

--UK Fiscal Year

SELECT 
CASE 
  WHEN MONTH(@DateFieldName) in (1,2,3)
   THEN CONCAT(YEAR(@DateFieldName) -1 , '-' , YEAR(@DateFieldName) )
   ELSE CONCAT(YEAR(@DateFieldName) , '-' , YEAR(@DateFieldName)+1 )  
  END AS [FISCAL YEAR]

--RESULT = '2019-2020'
于 2020-07-02T14:30:19.807 回答
0

这是英国的动态代码,

您可以根据不同的需求进行工作,

DECLARE @StartDate DATETIME

DECLARE @EndDate DATETIME

SET @StartDate = DATEADD(dd, 0,
    DATEDIFF(dd, 0,
        DATEADD(mm, - (((12 + DATEPART(m, getDate())) - 4)%12), getDate()) -
    datePart(d,DATEADD(mm, - (((12 + DATEPART(m, getDate())) - 4)%12),
        getDate() )) + 1 ))  

SET @EndDate = DATEADD(SS, -1, DATEADD(mm, 12, @StartDate))

SELECT @StartDate, @EndDate
于 2012-02-23T16:28:14.593 回答
0
    declare 
@InputDate datetime,
@FiscalInput varchar(2),
@FiscalYear varchar(4),
@FiscalMonth varchar(2),
@FiscalStart varchar(10),
@FiscalDate varchar(10)

set @FiscalInput = '10'
set @InputDate = '1/5/2010'
set @FiscalYear = (select 
                    case 
                    when datepart(mm,@InputDate) < cast(@FiscalInput as int)
                        then datepart(yyyy, @InputDate)
                    when datepart(mm,@InputDate) >= cast(@FiscalInput as int)
                        then datepart(yyyy, @InputDate) + 1
                        end FiscalYear)


set @FiscalStart = (select @FiscalInput + '/01/' + @FiscalYear)

set @FiscalDate = (select cast(datepart(mm,@InputDate) as varchar(2)) + '/' + cast(datepart(dd,@InputDate) as varchar(2)) + '/' + @FiscalYear)
set @FiscalMonth = (select 
                    case 
                    when datepart(mm,@InputDate) < cast(@FiscalInput as int)
                        then 13 + datediff(mm, cast(@FiscalStart as datetime),@InputDate)
                    when datepart(mm,@InputDate) >= cast(@FiscalInput as int)
                        then 1 + datediff(mm, cast(@FiscalStart as datetime), @FiscalDate)
                        end FiscalMonth)    

select @InputDate as Date, 
cast(@FiscalStart as datetime) as FiscalStart, 
dateadd(mm, 11,cast(@FiscalStart as datetime)) as FiscalStop,
cast(@FiscalDate as DateTime) as FiscalDate,
@FiscalMonth as FiscalMonth, 
@FiscalYear as FiscalYear
于 2013-07-10T17:25:26.647 回答
0

财政年度开始:

DATEADD(MONTH, DATEDIFF(MONTH, '20100401', getdate()) / 12 * 12, '20100401')

财政年度结束:

DATEADD(MONTH, DATEDIFF(MONTH, '20100401', getdate()) / 12 * 12, '20110331')

如果需要,替换getdate()为您自己的日期

于 2014-01-24T10:26:23.513 回答
0
DECLARE 
@StartDate DATETIME,
@EndDate DATETIME

if month(getdate())>3
Begin
        set  @StartDate=   convert(datetime, cast(year(getdate())-1 as varchar) + '-4-1')
        set @EndDate= convert(datetime, cast(year(getdate())  as varchar) + '-3-31')

end

else   
begin          
        set @StartDate= Convert(datetime, cast(year(getdate()) - 2 as varchar) + '-4-1')
        set @EndDate= convert(datetime, cast(year(getdate())-1 as varchar) + '-3-31')
end


select @StartDate, @EndDate
于 2015-06-04T15:10:04.630 回答
0

这是我的版本,它返回财年为 FYyyyy - 财年从 7 月 1 日开始

即 2015 年 6 月 1 日 -> 1415 财年,2015 年 7 月 1 日 -> 1516 财年

字符串函数可能会更好......

        CREATE FUNCTION [dbo].[FY](@DATE DATETIME)
        RETURNS char(6)
        AS
        BEGIN
            DECLARE @Answer     char(6)
            SET @Answer =    
            CASE WHEN MONTH(@DATE) < 7 
                 THEN 'FY' + RIGHT(CAST(YEAR(@DATE) - 1 AS VARCHAR(11)), 2) + RIGHT(CAST(YEAR(@DATE) AS VARCHAR(11)), 2) 
                 ELSE 'FY' + RIGHT(CAST(YEAR(@DATE) AS VARCHAR(11)), 2) + RIGHT(CAST(YEAR(@DATE) + 1 AS VARCHAR(11)), 2) END
            RETURN @Answer
        END
于 2016-05-18T23:22:15.890 回答
-1

对澳大利亚人来说更简单:)

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

于 2015-11-23T06:46:11.340 回答
-1

简单的方法——

DECLARE @DATE DATETIME = '2016/07/1'
-- 财政开始 SELECT CONVERT(DATETIME, (CAST(YEAR(@DATE) - IIF(MONTH(@DATE) > 6, 0, 1) AS VARCHAR) + '- 7-1'))

-- 财政结束 SELECT CONVERT(DATETIME, (CAST(YEAR(@DATE) + IIF(MONTH(@DATE) > 6, 1, 0) AS VARCHAR) + '-6-30'))

于 2016-04-01T10:06:51.190 回答