在SQL Server中计算会计年度

时间:2009-11-20 17:20:38

标签: sql-server accounting

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

19 个答案:

答案 0 :(得分:18)

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

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')

答案 1 :(得分:9)

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

 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'

答案 2 :(得分:8)

CASE WHEN MONTH(@Date) > 10 THEN YEAR(@Date) + 1 ELSE YEAR(@Date) END

答案 3 :(得分:6)

CASE 
  WHEN MONTH(Date) > 6 
   THEN YEAR(Date) + 1
   ELSE YEAR(Date)
  END AS [FISCAL YEAR]

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

答案 4 :(得分:2)

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

Array //$args
(
    [post_status] => publish
    [posts_per_page] => 6
    [ignore_sticky_posts] => 1
    [post_type] => post
    [meta_key] => _thumbnail_id
    [suppress_filters] => 
    [] => Array
        (
            [0] => Array
                (
                    [taxonomy] => category
                    [field] => id
                    [terms] => Array
                        (
                        )
                )
        )
)

$carousel_query = new WP_Query( $args );

if ( $carousel_query->have_posts() ) :
    while ( $carousel_query->have_posts() ) : $carousel_query->the_post();
        ........
    endwhile;
endif;

答案 5 :(得分:1)

此案例的最简单表达式: YEAR(DATEADD(month, 3, Date))

联邦财政年度

  

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

答案 6 :(得分: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'

答案 7 :(得分:1)

我刚才意识到Brett Veenstra的明确回答是错误的。不应该这样计算风险吗?:

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;

答案 8 :(得分:1)

我认为你不能,因为没有通用的财政日程表。财政年度因企业和国家而异。

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

答案 9 :(得分:1)

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

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

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

答案 10 :(得分:1)

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

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

答案 11 :(得分: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

答案 12 :(得分:0)

会计年度开始:

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

财政年度结束:

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

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

答案 13 :(得分: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

答案 14 :(得分: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

答案 15 :(得分:0)

这是我的版本,它返回财政年度为FYyyyy - 财政年度开始7/1

即。 2015年6月1日 - &gt; 2015财年,2015年7月1日 - &gt; FY1516

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

        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

答案 16 :(得分:0)

在上述@ 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

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

答案 17 :(得分:-1)

澳大利亚人更简单:)

(年(DATEADD(月, - ((DATEPART(月,[日期])+ 5)%12),[日期]))+)AS Financial_Year

答案 18 :(得分:-1)

简单的方法 -

DECLARE @DATE DATETIME ='2016/07/1'
- 财政开始 SELECT CONVERT(DATETIME,(CAST(年(@DATE) - IIF(月(@DATE)&gt; 6,0,1)AS VARCHAR)+' - 7-1'))

- 财政结束 SELECT CONVERT(DATETIME,(CAST(年(@DATE)+ IIF(月(@DATE)&gt; 6,1,0)AS VARCHAR)+' - 6-30'))