SQL Serverのビューの日付フィールドから会計年度をどのように計算しますか?
アプリケーションの会計年度に基づいてユーザー定義関数を使用することをお勧めします。
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')
CASE WHEN MONTH(@Date) > 10 THEN YEAR(@Date) + 1 ELSE YEAR(@Date) END
オーストラリアの会計年度の開始日コードは次のとおりです
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'
CASE
WHEN MONTH(Date) > 6
THEN YEAR(Date) + 1
ELSE YEAR(Date)
END AS [FISCAL YEAR]
この場合、会計年度は7/1から始まります。これが最も簡単な解決策です。
この場合の最も単純な式:YEAR(DATEADD(month, 3, Date))
会計年度は連邦政府の会計期間です。 10月1日から始まり、翌年の9月30日に終了します。各会計年度は、その会計年度が終了する暦年によって識別され、一般に「年度」と呼ばれます。たとえば、2003年度は2002年10月1日から始まり、2003年9月30日に終了します。特に、決議の継続を避けるために、歳出法案を処理するための時間を議会に提供することを目的としていました。
これは米国以外の国と地域には適用されない場合がありますが、必要に応じて番号3を置き換えるだけです。
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
@FiscalYearStartMonth
は会計年度の開始月(数値)であり、@Date
は問題の日付です。次の手順を実行します。
SELECT
CASE
WHEN @FiscalYearStartMonth = 1 OR @FiscalYearStartMonth > MONTH(@Date)
THEN YEAR(@Date)
ELSE YEAR(@Date) + 1
END AS FiscalYear
これを関数で抽象化するか、派生ビューの列として使用できます
普遍的な会計カレンダーがないので、私はあなたができるとは思いません。会計年度は企業や国によって異なります。
補遺:あなたがする必要があるのは、会計の開始日と該当する各年の会計の終了日で構成される個別のDBテーブルを用意することです。その表のデータを使用して、特定の日付が与えられた会計年度を計算します。
これを行うには、複数のフィールドが必要です...
会社ごとに異なるため、会計年度の定義を確認する必要があります
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;
年度開始:
DATEADD(MONTH、DATEDIFF(MONTH、 '20100401'、getdate())/ 12 * 12、 '20100401')
年度末:
DATEADD(MONTH、DATEDIFF(MONTH、 '20100401'、getdate())/ 12 * 12、 '20110331')
必要に応じて、getdate()
を独自の日付に置き換えます
@ 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
私はこれが最も単純で、おそらく最もわかりやすい実装だと思います。
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
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
これは、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