SQL Server のビューの日付フィールドからどのように会計年度を計算しますか?
19 に答える
アプリケーションの会計年度に基づいてユーザー定義関数を使用することをお勧めします。
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 日に終わります。各会計年度は、それが終了する暦年によって識別され、一般に「FY」と呼ばれます。たとえば、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
これを関数で抽象化するか、派生ビューの列として使用できます
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;
普遍的な会計カレンダーがないため、できないと思います。会計年度は企業や国によって異なります。
補遺: あなたがする必要があるのは、会計開始日と該当する各年度の会計終了日で構成される個別の DB テーブルを用意することです。そのテーブルのデータを使用して、特定の日付が与えられた会計年度を計算します。
これを行うには、複数のフィールドが必要になります...
会計年度の定義は会社によって異なるため、確認する必要があります。
これは会計年度を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
英国の動的コードは次のとおりです。
さまざまなニーズに基づいて回避できます。
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
オーストラリア人にとってはもっと簡単です:)
(YEAR(DATEADD(Month,-((DATEPART(Month,[Date])+5) %12),[Date]))+) AS Financial_Year
簡単な方法 -
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'))