在SQL Server中计算会计年度

zaq34kh6  于 2022-09-18  发布在  Java
关注(0)|答案(20)|浏览(187)

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

9cbw7uwe

9cbw7uwe1#

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

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

gzjq41n42#

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

nhaq1z213#

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

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'一样返回

2guxujil

2guxujil4#

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

In this case, Fiscal Year starts on 7/1. This is the simplest solution out there.

2ic8powd

2ic8powd5#

我已经扩展了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
ac1kyiln

ac1kyiln6#

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

联邦财政年度

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

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

bnlyeluc

bnlyeluc7#

我认为你做不到,因为没有通用的会计日历。会计年度因企业和国家而异。

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

vi4fp9gy

vi4fp9gy8#

要做到这一点,你需要的不只是一个领域。

你应该检查你对财政年度的定义,因为不同的公司它是不同的

hivapdat

hivapdat9#

假定@FiscalYearStartMonth是您的财政年度开始月份(数字),@Date是有问题的日期,请执行以下操作:

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

您可以在函数中省略这一点,或用作派生视图中的列

bcs8qyzn

bcs8qyzn10#

我刚刚意识到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;
yrwegjxp

yrwegjxp11#

基于@Csaba-Toth上面的答案,并假设您的财政年度从每月的第一天开始

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

我的财年从7月1日开始,也就是第7个月,所以我的常量是(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

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

ou6hu8tu

ou6hu8tu12#

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

pb3s4cty13#

过去一年,开始日期为oct 1st 10-1-2021

代码:

CAST(CONVERT (varchar(4),YEAR(GetDate())-1) + '-' + '10' + '-' + '01' AS Datetime2(0))
dojqjjoe

dojqjjoe14#

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
lf5gs5x2

lf5gs5x215#

以下是英国的动态代码,

您可以根据不同的需求来解决问题,

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

相关问题