web-dev-qa-db-ja.com

SQL Serverで会計年度を計算する

SQL Serverのビューの日付フィールドから会計年度をどのように計算しますか?

16
R0b0tn1k

アプリケーションの会計年度に基づいてユーザー定義関数を使用することをお勧めします。

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')
20
Brett Veenstra
CASE WHEN MONTH(@Date) > 10 THEN YEAR(@Date) + 1 ELSE YEAR(@Date) END
11
R0b0tn1k

オーストラリアの会計年度の開始日コードは次のとおりです

 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'

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

この場合、会計年度は7/1から始まります。これが最も簡単な解決策です。

6
user1200359

この場合の最も単純な式:YEAR(DATEADD(month, 3, Date))

連邦会計年度

会計年度は連邦政府の会計期間です。 10月1日から始まり、翌年の9月30日に終了します。各会計年度は、その会計年度が終了する暦年によって識別され、一般に「年度」と呼ばれます。たとえば、2003年度は2002年10月1日から始まり、2003年9月30日に終了します。特に、決議の継続を避けるために、歳出法案を処理するための時間を議会に提供することを目的としていました。

これは米国以外の国と地域には適用されない場合がありますが、必要に応じて番号3を置き換えるだけです。

2
Csaba Toth

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
2
Ravenlee

@FiscalYearStartMonthは会計年度の開始月(数値)であり、@Dateは問題の日付です。次の手順を実行します。

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

これを関数で抽象化するか、派生ビューの列として使用できます

1
roman m

普遍的な会計カレンダーがないので、私はあなたができるとは思いません。会計年度は企業や国によって異なります。

補遺:あなたがする必要があるのは、会計の開始日と該当する各年の会計の終了日で構成される個別のDBテーブルを用意することです。その表のデータを使用して、特定の日付が与えられた会計年度を計算します。

1
alex

これを行うには、複数のフィールドが必要です...

会社ごとに異なるため、会計年度の定義を確認する必要があります

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;
1
gnarbarian

年度開始:

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

年度末:

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

必要に応じて、getdate()を独自の日付に置き換えます

0
Simon

@ csaba-tothによる上記の回答に基づいて、会計年度がその月の最初の日に始まると仮定します

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

私のFYは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

私はこれが最も単純で、おそらく最もわかりやすい実装だと思います。

0
BobHy
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

これは英国の動的コードです、

さまざまなニーズに基づいて回避できます

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
0
Conficker
    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
0
Wolfsvein

これは、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
0
rheitzman